42 |
enum TTYState { |
enum TTYState { |
43 |
TTY_STATE_NORM, |
TTY_STATE_NORM, |
44 |
TTY_STATE_ESC, |
TTY_STATE_ESC, |
45 |
|
TTY_STATE_ESC2, |
46 |
TTY_STATE_CSI, |
TTY_STATE_CSI, |
47 |
}; |
}; |
48 |
|
|
55 |
int esc_params[MAX_ESC_PARAMS]; |
int esc_params[MAX_ESC_PARAMS]; |
56 |
int nb_esc_params; |
int nb_esc_params; |
57 |
int state; |
int state; |
58 |
|
int esc1; |
59 |
int shifted; |
int shifted; |
60 |
EditBuffer *b; |
EditBuffer *b; |
61 |
EditBuffer *b_color; /* color buffer, one byte per char */ |
EditBuffer *b_color; /* color buffer, one byte per char */ |
304 |
} |
} |
305 |
break; |
break; |
306 |
case 14: |
case 14: |
|
//eb_set_charset(s->b, &charset_8859_1); |
|
307 |
s->shifted = 1; |
s->shifted = 1; |
308 |
break; |
break; |
309 |
case 15: |
case 15: |
|
//eb_set_charset(s->b, &charset_cp1125); |
|
310 |
s->shifted = 0; |
s->shifted = 0; |
311 |
break; |
break; |
312 |
case 27: |
case 27: |
315 |
default: |
default: |
316 |
if (c >= 32 || c == 9) { |
if (c >= 32 || c == 9) { |
317 |
int c1, cur_len, len; |
int c1, cur_len, len; |
318 |
|
/* CG: assuming ISO-8859-1 characters */ |
319 |
/* CG: horrible kludge for alternate charset support */ |
/* CG: horrible kludge for alternate charset support */ |
320 |
if (s->shifted && c >= 96 && c < 128) |
if (s->shifted && c >= 96 && c < 128) |
321 |
c += 32; |
c += 32; |
347 |
s->nb_esc_params = 0; |
s->nb_esc_params = 0; |
348 |
s->state = TTY_STATE_CSI; |
s->state = TTY_STATE_CSI; |
349 |
} else { |
} else { |
350 |
s->state = TTY_STATE_NORM; |
/* CG: should deal with other sequences: |
351 |
|
* ansi: hts=\EH, s0ds=\E(B, s1ds=\E)B, s2ds=\E*B, s3ds=\E+B, |
352 |
|
* linux: hts=\EH, rc=\E8, ri=\EM, rs1=\Ec\E]R, sc=\E7, |
353 |
|
* vt100: enacs=\E(B\E)0, hts=\EH, rc=\E8, ri=\EM$<5>, |
354 |
|
* rmkx=\E[?1l\E>, |
355 |
|
* rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7, |
356 |
|
* smkx=\E[?1h\E=, |
357 |
|
* xterm: enacs=\E(B\E)0, hts=\EH, is2=\E[!p\E[?3;4l\E[4l\E>, |
358 |
|
* rc=\E8, ri=\EM, rmkx=\E[?1l\E>, rs1=\Ec, |
359 |
|
* rs2=\E[!p\E[?3;4l\E[4l\E>, sc=\E7, smkx=\E[?1h\E=, |
360 |
|
*/ |
361 |
|
switch (c) { |
362 |
|
case '(': |
363 |
|
case ')': |
364 |
|
case '*': |
365 |
|
case '+': |
366 |
|
case ']': |
367 |
|
s->esc1 = c; |
368 |
|
s->state = TTY_STATE_ESC2; |
369 |
|
break; |
370 |
|
case 'H': // hts |
371 |
|
case '7': // sc |
372 |
|
case '8': // rc |
373 |
|
case 'M': // ri |
374 |
|
case 'c': // rs1 |
375 |
|
case '>': // rmkx, is2, rs2 |
376 |
|
case '=': // smkx |
377 |
|
// XXX: do these |
378 |
|
default: |
379 |
|
s->state = TTY_STATE_NORM; |
380 |
|
break; |
381 |
|
} |
382 |
} |
} |
383 |
break; |
break; |
384 |
|
case TTY_STATE_ESC2: |
385 |
|
s->state = TTY_STATE_NORM; |
386 |
|
#define ESC2(c1,c2) (((c1)<<8)|((unsigned char)c2)) |
387 |
|
switch (ESC2(s->esc1, c)) { |
388 |
|
case ESC2('(','B'): |
389 |
|
case ESC2(')','B'): |
390 |
|
case ESC2('(','0'): |
391 |
|
case ESC2(')','0'): |
392 |
|
case ESC2('*','B'): |
393 |
|
case ESC2('+','B'): |
394 |
|
case ESC2(']','R'): |
395 |
|
/* XXX: ??? */ |
396 |
|
break; |
397 |
|
} |
398 |
|
#undef ESC2 |
399 |
|
break; |
400 |
case TTY_STATE_CSI: |
case TTY_STATE_CSI: |
401 |
if (c >= '0' && c <= '9') { |
if (c >= '0' && c <= '9') { |
402 |
if (s->nb_esc_params < MAX_ESC_PARAMS) { |
if (s->nb_esc_params < MAX_ESC_PARAMS) { |