17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <ndraw.h>
47dd7cddfSDavid du Colombier #include <bio.h>
57dd7cddfSDavid du Colombier #include "cons.h"
67dd7cddfSDavid du Colombier
77dd7cddfSDavid du Colombier char *term = "2621";
87dd7cddfSDavid du Colombier
97dd7cddfSDavid du Colombier struct funckey fk[32];
107dd7cddfSDavid du Colombier
117dd7cddfSDavid du Colombier void
emulate(void)127dd7cddfSDavid du Colombier emulate(void)
137dd7cddfSDavid du Colombier {
147dd7cddfSDavid du Colombier char buf[BUFS+1];
157dd7cddfSDavid du Colombier int n;
167dd7cddfSDavid du Colombier int c;
177dd7cddfSDavid du Colombier int standout = 0;
187dd7cddfSDavid du Colombier int insmode = 0;
197dd7cddfSDavid du Colombier
207dd7cddfSDavid du Colombier for (;;) {
217dd7cddfSDavid du Colombier if (x > xmax || y > ymax) {
227dd7cddfSDavid du Colombier x = 0;
237dd7cddfSDavid du Colombier newline();
247dd7cddfSDavid du Colombier }
257dd7cddfSDavid du Colombier buf[0] = get_next_char();
267dd7cddfSDavid du Colombier buf[1] = '\0';
277dd7cddfSDavid du Colombier switch(buf[0]) {
287dd7cddfSDavid du Colombier
297dd7cddfSDavid du Colombier case '\000': /* nulls, just ignore 'em */
307dd7cddfSDavid du Colombier break;
317dd7cddfSDavid du Colombier
327dd7cddfSDavid du Colombier case '\007': /* bell */
337dd7cddfSDavid du Colombier ringbell();
347dd7cddfSDavid du Colombier break;
357dd7cddfSDavid du Colombier
367dd7cddfSDavid du Colombier case '\t': /* tab modulo 8 */
377dd7cddfSDavid du Colombier x = (x|7)+1;
387dd7cddfSDavid du Colombier break;
397dd7cddfSDavid du Colombier
407dd7cddfSDavid du Colombier case '\033':
417dd7cddfSDavid du Colombier switch(get_next_char()) {
427dd7cddfSDavid du Colombier
437dd7cddfSDavid du Colombier case 'j':
447dd7cddfSDavid du Colombier get_next_char();
457dd7cddfSDavid du Colombier break;
467dd7cddfSDavid du Colombier
477dd7cddfSDavid du Colombier case '&': /* position cursor &c */
487dd7cddfSDavid du Colombier switch(get_next_char()) {
497dd7cddfSDavid du Colombier
507dd7cddfSDavid du Colombier case 'a':
517dd7cddfSDavid du Colombier for (;;) {
5280ee5cbfSDavid du Colombier n = number(buf, nil);
537dd7cddfSDavid du Colombier switch(buf[0]) {
547dd7cddfSDavid du Colombier
557dd7cddfSDavid du Colombier case 'r':
567dd7cddfSDavid du Colombier case 'y':
577dd7cddfSDavid du Colombier y = n;
587dd7cddfSDavid du Colombier continue;
597dd7cddfSDavid du Colombier
607dd7cddfSDavid du Colombier case 'c':
617dd7cddfSDavid du Colombier x = n;
627dd7cddfSDavid du Colombier continue;
637dd7cddfSDavid du Colombier
647dd7cddfSDavid du Colombier case 'R':
657dd7cddfSDavid du Colombier case 'Y':
667dd7cddfSDavid du Colombier y = n;
677dd7cddfSDavid du Colombier break;
687dd7cddfSDavid du Colombier
697dd7cddfSDavid du Colombier case 'C':
707dd7cddfSDavid du Colombier x = n;
717dd7cddfSDavid du Colombier break;
727dd7cddfSDavid du Colombier }
737dd7cddfSDavid du Colombier break;
747dd7cddfSDavid du Colombier }
757dd7cddfSDavid du Colombier break;
767dd7cddfSDavid du Colombier
777dd7cddfSDavid du Colombier case 'd': /* underline stuff */
787dd7cddfSDavid du Colombier if ((n=get_next_char())>='A' && n <= 'O')
797dd7cddfSDavid du Colombier standout++;
807dd7cddfSDavid du Colombier else if (n == '@')
817dd7cddfSDavid du Colombier standout = 0;
827dd7cddfSDavid du Colombier break;
837dd7cddfSDavid du Colombier
847dd7cddfSDavid du Colombier default:
857dd7cddfSDavid du Colombier get_next_char();
867dd7cddfSDavid du Colombier break;
877dd7cddfSDavid du Colombier
887dd7cddfSDavid du Colombier }
897dd7cddfSDavid du Colombier break;
907dd7cddfSDavid du Colombier
917dd7cddfSDavid du Colombier case 'i': /* back tab */
927dd7cddfSDavid du Colombier if (x>0)
937dd7cddfSDavid du Colombier x = (x-1) & ~07;
947dd7cddfSDavid du Colombier break;
957dd7cddfSDavid du Colombier
967dd7cddfSDavid du Colombier case 'H': /* home cursor */
977dd7cddfSDavid du Colombier case 'h':
987dd7cddfSDavid du Colombier x = 0;
997dd7cddfSDavid du Colombier y = 0;
1007dd7cddfSDavid du Colombier break;
1017dd7cddfSDavid du Colombier
1027dd7cddfSDavid du Colombier case 'L': /* insert blank line */
1037dd7cddfSDavid du Colombier scroll(y, ymax, y+1, y);
1047dd7cddfSDavid du Colombier break;
1057dd7cddfSDavid du Colombier
1067dd7cddfSDavid du Colombier case 'M': /* delete line */
1077dd7cddfSDavid du Colombier scroll(y+1, ymax+1, y, ymax);
1087dd7cddfSDavid du Colombier break;
1097dd7cddfSDavid du Colombier
1107dd7cddfSDavid du Colombier case 'J': /* clear to end of display */
1117dd7cddfSDavid du Colombier xtipple(Rpt(pt(0, y+1),
1127dd7cddfSDavid du Colombier pt(xmax+1, ymax+1)));
1137dd7cddfSDavid du Colombier /* flow */
1147dd7cddfSDavid du Colombier case 'K': /* clear to EOL */
1157dd7cddfSDavid du Colombier xtipple(Rpt(pt(x, y),
1167dd7cddfSDavid du Colombier pt(xmax+1, y+1)));
1177dd7cddfSDavid du Colombier break;
1187dd7cddfSDavid du Colombier
1197dd7cddfSDavid du Colombier case 'P': /* delete char */
1207dd7cddfSDavid du Colombier bitblt(&screen, pt(x, y),
1217dd7cddfSDavid du Colombier &screen, Rpt(pt(x+1, y),
1227dd7cddfSDavid du Colombier pt(xmax+1, y+1)),
1237dd7cddfSDavid du Colombier S);
1247dd7cddfSDavid du Colombier xtipple(Rpt(pt(xmax, y),
1257dd7cddfSDavid du Colombier pt(xmax+1, y+1)));
1267dd7cddfSDavid du Colombier break;
1277dd7cddfSDavid du Colombier
1287dd7cddfSDavid du Colombier case 'Q': /* enter insert mode */
1297dd7cddfSDavid du Colombier insmode++;
1307dd7cddfSDavid du Colombier break;
1317dd7cddfSDavid du Colombier
1327dd7cddfSDavid du Colombier case 'R': /* leave insert mode */
1337dd7cddfSDavid du Colombier insmode = 0;
1347dd7cddfSDavid du Colombier break;
1357dd7cddfSDavid du Colombier
1367dd7cddfSDavid du Colombier case 'S': /* roll up */
1377dd7cddfSDavid du Colombier scroll(1, ymax+1, 0, ymax);
1387dd7cddfSDavid du Colombier break;
1397dd7cddfSDavid du Colombier
1407dd7cddfSDavid du Colombier case 'T':
1417dd7cddfSDavid du Colombier scroll(0, ymax, 1, 0);
1427dd7cddfSDavid du Colombier break;
1437dd7cddfSDavid du Colombier
1447dd7cddfSDavid du Colombier case 'A': /* upline */
1457dd7cddfSDavid du Colombier case 't':
1467dd7cddfSDavid du Colombier if (y>0)
1477dd7cddfSDavid du Colombier y--;
1487dd7cddfSDavid du Colombier if (olines > 0)
1497dd7cddfSDavid du Colombier olines--;
1507dd7cddfSDavid du Colombier break;
1517dd7cddfSDavid du Colombier
1527dd7cddfSDavid du Colombier case 'B':
1537dd7cddfSDavid du Colombier case 'w':
1547dd7cddfSDavid du Colombier y++; /* downline */
1557dd7cddfSDavid du Colombier break;
1567dd7cddfSDavid du Colombier
1577dd7cddfSDavid du Colombier case 'C': /* right */
1587dd7cddfSDavid du Colombier case 'v':
1597dd7cddfSDavid du Colombier x++;
1607dd7cddfSDavid du Colombier break;
1617dd7cddfSDavid du Colombier
1627dd7cddfSDavid du Colombier case 'D': /* left */
1637dd7cddfSDavid du Colombier case 'u':
1647dd7cddfSDavid du Colombier x--;
1657dd7cddfSDavid du Colombier
1667dd7cddfSDavid du Colombier }
1677dd7cddfSDavid du Colombier break;
1687dd7cddfSDavid du Colombier
1697dd7cddfSDavid du Colombier case '\b': /* backspace */
1707dd7cddfSDavid du Colombier if(x > 0)
1717dd7cddfSDavid du Colombier --x;
1727dd7cddfSDavid du Colombier break;
1737dd7cddfSDavid du Colombier
1747dd7cddfSDavid du Colombier case '\n': /* linefeed */
1757dd7cddfSDavid du Colombier newline();
1767dd7cddfSDavid du Colombier standout = 0;
1777dd7cddfSDavid du Colombier if( ttystate[cs->raw].nlcr )
1787dd7cddfSDavid du Colombier x = 0;
1797dd7cddfSDavid du Colombier break;
1807dd7cddfSDavid du Colombier
1817dd7cddfSDavid du Colombier case '\r': /* carriage return */
1827dd7cddfSDavid du Colombier x = 0;
1837dd7cddfSDavid du Colombier standout = 0;
1847dd7cddfSDavid du Colombier if( ttystate[cs->raw].crnl )
1857dd7cddfSDavid du Colombier newline();
1867dd7cddfSDavid du Colombier break;
1877dd7cddfSDavid du Colombier
1887dd7cddfSDavid du Colombier default: /* ordinary char */
1897dd7cddfSDavid du Colombier n = 1;
1907dd7cddfSDavid du Colombier c = 0;
1917dd7cddfSDavid du Colombier while (!cs->raw && host_avail() && x+n<=xmax && n<BUFS
1927dd7cddfSDavid du Colombier && (c = get_next_char())>=' ' && c<'\177') {
1937dd7cddfSDavid du Colombier buf[n++] = c;
1947dd7cddfSDavid du Colombier c = 0;
1957dd7cddfSDavid du Colombier }
1967dd7cddfSDavid du Colombier buf[n] = 0;
1977dd7cddfSDavid du Colombier if (insmode) {
1987dd7cddfSDavid du Colombier bitblt(&screen, pt(x+n, y), &screen,
1997dd7cddfSDavid du Colombier Rpt(pt(x, y), pt(xmax-n+1, y+1)), S);
2007dd7cddfSDavid du Colombier }
2017dd7cddfSDavid du Colombier xtipple(Rpt(pt(x,y), pt(x+n, y+1)));
202*7fb4e6f1SDavid du Colombier string(&screen, pt(x, y), font, buf, DxorS);
2037dd7cddfSDavid du Colombier if (standout)
2047dd7cddfSDavid du Colombier rectf(&screen,
2057dd7cddfSDavid du Colombier Rpt(pt(x,y),pt(x+n,y+1)),
2067dd7cddfSDavid du Colombier DxorS);
2077dd7cddfSDavid du Colombier x += n;
2087dd7cddfSDavid du Colombier peekc = c;
2097dd7cddfSDavid du Colombier break;
2107dd7cddfSDavid du Colombier }
2117dd7cddfSDavid du Colombier }
2127dd7cddfSDavid du Colombier }
213