Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
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
}