xref: /plan9/sys/src/cmd/vt/hp.c (revision 7fb4e6f143e1a012576a1b153cfd45130821f9de)
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