xref: /plan9/sys/src/cmd/vt/hp.c (revision 7fb4e6f143e1a012576a1b153cfd45130821f9de)
1 #include <u.h>
2 #include <libc.h>
3 #include <ndraw.h>
4 #include <bio.h>
5 #include "cons.h"
6 
7 char *term = "2621";
8 
9 struct funckey fk[32];
10 
11 void
emulate(void)12 emulate(void)
13 {
14 	char buf[BUFS+1];
15 	int n;
16 	int c;
17 	int standout = 0;
18 	int insmode = 0;
19 
20 	for (;;) {
21 		if (x > xmax || y > ymax) {
22 			x = 0;
23 			newline();
24 		}
25 		buf[0] = get_next_char();
26 		buf[1] = '\0';
27 		switch(buf[0]) {
28 
29 		case '\000':		/* nulls, just ignore 'em */
30 			break;
31 
32 		case '\007':		/* bell */
33 			ringbell();
34 			break;
35 
36 		case '\t':		/* tab modulo 8 */
37 			x = (x|7)+1;
38 			break;
39 
40 		case '\033':
41 			switch(get_next_char()) {
42 
43 			case 'j':
44 				get_next_char();
45 				break;
46 
47 			case '&':	/* position cursor &c */
48 				switch(get_next_char()) {
49 
50 				case 'a':
51 					for (;;) {
52 						n = number(buf, nil);
53 						switch(buf[0]) {
54 
55 						case 'r':
56 						case 'y':
57 							y = n;
58 							continue;
59 
60 						case 'c':
61 							x = n;
62 							continue;
63 
64 						case 'R':
65 						case 'Y':
66 							y = n;
67 							break;
68 
69 						case 'C':
70 							x = n;
71 							break;
72 						}
73 						break;
74 					}
75 					break;
76 
77 				case 'd':	/* underline stuff */
78 					if ((n=get_next_char())>='A' && n <= 'O')
79 						standout++;
80 					else if (n == '@')
81 						standout = 0;
82 					break;
83 
84 				default:
85 					get_next_char();
86 					break;
87 
88 				}
89 				break;
90 
91 			case 'i':	/* back tab */
92 				if (x>0)
93 					x = (x-1) & ~07;
94 				break;
95 
96 			case 'H':	/* home cursor */
97 			case 'h':
98 				x = 0;
99 				y = 0;
100 				break;
101 
102 			case 'L':	/* insert blank line */
103 				scroll(y, ymax, y+1, y);
104 				break;
105 
106 			case 'M':	/* delete line */
107 				scroll(y+1, ymax+1, y, ymax);
108 				break;
109 
110 			case 'J':	/* clear to end of display */
111 				xtipple(Rpt(pt(0, y+1),
112 					    pt(xmax+1, ymax+1)));
113 				/* flow */
114 			case 'K':	/* clear to EOL */
115 				xtipple(Rpt(pt(x, y),
116 					    pt(xmax+1, y+1)));
117 				break;
118 
119 			case 'P':	/* delete char */
120 				bitblt(&screen, pt(x, y),
121 					&screen, Rpt(pt(x+1, y),
122 					pt(xmax+1, y+1)),
123 				        S);
124 				xtipple(Rpt(pt(xmax, y),
125 					    pt(xmax+1, y+1)));
126 				break;
127 
128 			case 'Q':	/* enter insert mode */
129 				insmode++;
130 				break;
131 
132 			case 'R':	/* leave insert mode */
133 				insmode = 0;
134 				break;
135 
136 			case 'S':	/* roll up */
137 				scroll(1, ymax+1, 0, ymax);
138 				break;
139 
140 			case 'T':
141 				scroll(0, ymax, 1, 0);
142 				break;
143 
144 			case 'A':	/* upline */
145 			case 't':
146 				if (y>0)
147 					y--;
148 				if (olines > 0)
149 					olines--;
150 				break;
151 
152 			case 'B':
153 			case 'w':
154 				y++;	/* downline */
155 				break;
156 
157 			case 'C':	/* right */
158 			case 'v':
159 				x++;
160 				break;
161 
162 			case 'D':	/* left */
163 			case 'u':
164 				x--;
165 
166 			}
167 			break;
168 
169 		case '\b':		/* backspace */
170 			if(x > 0)
171 				--x;
172 			break;
173 
174 		case '\n':		/* linefeed */
175 			newline();
176 			standout = 0;
177 			if( ttystate[cs->raw].nlcr )
178 				x = 0;
179 			break;
180 
181 		case '\r':		/* carriage return */
182 			x = 0;
183 			standout = 0;
184 			if( ttystate[cs->raw].crnl )
185 				newline();
186 			break;
187 
188 		default:		/* ordinary char */
189 			n = 1;
190 			c = 0;
191 			while (!cs->raw && host_avail() && x+n<=xmax && n<BUFS
192 			    && (c = get_next_char())>=' ' && c<'\177') {
193 				buf[n++] = c;
194 				c = 0;
195 			}
196 			buf[n] = 0;
197 			if (insmode) {
198 				bitblt(&screen, pt(x+n, y), &screen,
199 					Rpt(pt(x, y), pt(xmax-n+1, y+1)), S);
200 			}
201 			xtipple(Rpt(pt(x,y), pt(x+n, y+1)));
202 			string(&screen, pt(x, y), font, buf, DxorS);
203 			if (standout)
204 				rectf(&screen,
205 				      Rpt(pt(x,y),pt(x+n,y+1)),
206 				      DxorS);
207 			x += n;
208 			peekc = c;
209 			break;
210 		}
211 	}
212 }
213