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