diff options
Diffstat (limited to 'src/vt102.c')
-rw-r--r-- | src/vt102.c | 70 |
1 files changed, 51 insertions, 19 deletions
diff --git a/src/vt102.c b/src/vt102.c index d74437f..292e15c 100644 --- a/src/vt102.c +++ b/src/vt102.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.31 2008/02/22 17:07:00 james + * *** empty log message *** + * * Revision 1.30 2008/02/22 14:51:54 james * *** empty log message *** * @@ -416,7 +419,7 @@ vt102_cursor_advance_line (Context * c) vt102_history (c, v->top_margin, v->bottom_margin); - crt_scroll_up (&v->crt, v->top_margin, v->bottom_margin, 1); + crt_scroll_up (&v->crt, v->top_margin, v->bottom_margin, 1, v->color); return; } @@ -473,7 +476,7 @@ vt102_cursor_advance (Context * c) return; } v->pending_wrap++; - if (c->v->xn_glitch) + if (!c->v->xn_glitch) vt102_do_pending_wrap(c); } @@ -911,7 +914,7 @@ vt102_parse_esc (Context * c, int ch) { vt102_log_line (c, v->pos.y); vt102_history (c, v->top_margin, v->bottom_margin); - crt_scroll_up (&v->crt, v->top_margin, v->bottom_margin, 1); + crt_scroll_up (&v->crt, v->top_margin, v->bottom_margin, 1,v->color); } else { @@ -924,7 +927,7 @@ vt102_parse_esc (Context * c, int ch) case 'M': if (v->pos.y == v->top_margin.y) { - crt_scroll_down (&v->crt, v->top_margin, v->bottom_margin, 1); + crt_scroll_down (&v->crt, v->top_margin, v->bottom_margin, 1,v->color); } else { @@ -1035,13 +1038,13 @@ vt102_parse_csi (Context * c, char *buf, int len) switch (narg) { case 0: - crt_erase (&v->crt, v->pos, v->screen_end, 1); + crt_erase (&v->crt, v->pos, v->screen_end, 1,v->color); break; case 1: - crt_erase (&v->crt, v->screen_start, v->pos, 1); + crt_erase (&v->crt, v->screen_start, v->pos, 1,v->color); break; case 2: - crt_erase (&v->crt, v->screen_start, v->screen_end, 1); + crt_erase (&v->crt, v->screen_start, v->screen_end, 1,v->color); break; } break; @@ -1055,13 +1058,13 @@ vt102_parse_csi (Context * c, char *buf, int len) switch (narg) { case 0: - crt_erase (&v->crt, v->pos, le, 1); + crt_erase (&v->crt, v->pos, le, 1,v->color); break; case 1: - crt_erase (&v->crt, ls, v->pos, 1); + crt_erase (&v->crt, ls, v->pos, 1,v->color); break; case 2: - crt_erase (&v->crt, ls, le, 1); + crt_erase (&v->crt, ls, le, 1,v->color); break; } } @@ -1072,7 +1075,7 @@ vt102_parse_csi (Context * c, char *buf, int len) && (v->pos.y <= v->bottom_margin.y)) { while (narg--) - crt_scroll_down (&v->crt, v->pos, v->bottom_margin, 1); + crt_scroll_down (&v->crt, v->pos, v->bottom_margin, 1,v->color); } break; @@ -1083,7 +1086,7 @@ vt102_parse_csi (Context * c, char *buf, int len) while (narg--) { vt102_history (c, v->pos, v->bottom_margin); - crt_scroll_up (&v->crt, v->pos, v->bottom_margin, 1); + crt_scroll_up (&v->crt, v->pos, v->bottom_margin, 1,v->color); } } break; @@ -1098,12 +1101,12 @@ vt102_parse_csi (Context * c, char *buf, int len) while (narg--) { vt102_history (c, v->top_margin, v->bottom_margin); - crt_scroll_up (&v->crt, v->top_margin, v->bottom_margin, 1); + crt_scroll_up (&v->crt, v->top_margin, v->bottom_margin, 1,v->color); } break; case 'T': while (narg--) - crt_scroll_down (&v->crt, v->top_margin, v->bottom_margin, 1); + crt_scroll_down (&v->crt, v->top_margin, v->bottom_margin, 1,v->color); break; case 'X': { @@ -1114,7 +1117,7 @@ vt102_parse_csi (Context * c, char *buf, int len) if (end.x > v->bottom_margin.x) end.x = v->bottom_margin.x; - crt_erase (&v->crt, v->pos, end, 1); + crt_erase (&v->crt, v->pos, end, 1,v->color); } break; case 'Z': @@ -1237,10 +1240,28 @@ vt102_parse_char (Context * c, int ch) VT102_parser *p = &v->parser; #if 1 - log_f (c->l, "char %3d %c pc %d %d %2d %2d %d",ch,safe_ch(ch), - p->in_csi, p->in_escape, v->pos.x, v->pos.y,v->pending_wrap); + log_f (c->l, "char %3d %c pc %d %d %d %2d %2d %d",ch,safe_ch(ch), + p->in_utf8,p->in_escape, p->in_csi, v->pos.x, v->pos.y,v->pending_wrap); #endif - if (p->in_csi) + + if ((ch>=0xc0) && (ch<0xe0)) /*Start of two byte unicode sequence*/ + { + p->in_utf8=2; + } else if ((ch>=0xe0) && (ch<0xf0)) /*Start of three byte unicode sequence*/ + { + p->in_utf8=3; + } else if ((ch>=0xf0) && (ch<0xf7)) /*Start of four byte unicode sequence*/ + p->in_utf8=4; + } + + if (p->utf_8) { + p->in_utf8--; + ch='?'; + } + + if (p->utf_8) { + /*Not first or last byte in sequence*/ + }else if (p->in_csi) { p->csi_buf[p->csi_ptr++] = ch; if (csi_ender (ch) || (p->csi_ptr == VT102_CSI_LEN)) @@ -1275,6 +1296,12 @@ vt102_parse_char (Context * c, int ch) vt102_parse_esc (c, ch); } } + else if (ch==0x9b) /*One byte CSI*/ + { + p->csi_ptr = 0; + p->csi_buf[p->csi_ptr++] = '['; + p->in_csi++; + } else { @@ -1582,7 +1609,6 @@ vt102_reset (VT102 * v) v->last_reg_char = ' '; - v->xn_glitch=0; } @@ -1630,6 +1656,7 @@ vt102_new (void) VT102 *v; v = (VT102 *) malloc (sizeof (VT102)); + v->xn_glitch=1; vt102_reset (v); @@ -1637,6 +1664,11 @@ vt102_new (void) return v; } +void vt102_set_ansi(VT102 *v,int ansi) +{ +v->xn_glitch=ansi ? 0:1; +} + void vt102_free (VT102 * v) { |