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 } 213