]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/vt/hp.c
vt: utf-8 support
[plan9front.git] / sys / src / cmd / vt / hp.c
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 }