aboutsummaryrefslogtreecommitdiffstats
path: root/src/vt102.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vt102.c')
-rw-r--r--src/vt102.c70
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)
{