/*
* $Log$
+ * Revision 1.34 2008/02/23 11:48:37 james
+ * *** empty log message ***
+ *
+ * Revision 1.33 2008/02/22 23:39:27 james
+ * *** empty log message ***
+ *
+ * Revision 1.32 2008/02/22 19:12:05 james
+ * *** empty log message ***
+ *
+ * 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 ***
*
static inline int
-safe_ch(int c) {
-if (c<32) return ' ';
-if (c>126) return ' ';
-return c;
+safe_ch (int c)
+{
+ if (c < 32)
+ return ' ';
+ if (c > 126)
+ return ' ';
+ return c;
}
static inline int
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;
}
- if (v->pos.y!=v->screen_end.y) v->pos.y++;
+ if (v->pos.y != v->screen_end.y)
+ v->pos.y++;
v->pending_wrap = 0;
}
return;
}
v->pending_wrap++;
- if (c->v->xn_glitch)
- vt102_do_pending_wrap(c);
+ if (!c->v->xn_glitch)
+ vt102_do_pending_wrap (c);
}
{
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
{
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
{
case '>':
v->application_keypad_mode = 0;
break;
+ case ']':
+ v->parser.ignore_until_bell++;
+ break;
default:
- log_f (c->l, "<%s:%d unhandled ESC: \\033 \\%03o (ESC %c)>", __FILE__,__LINE__,ch,safe_ch(ch));
+ log_f (c->l, "<%s:%d unhandled ESC: \\033 \\%03o (ESC %c)>", __FILE__,
+ __LINE__, ch, safe_ch (ch));
;
}
vt102_cursor_advance_tab (c->v);
break;
case 'J':
- if (len == 2)
- narg = 0; /*Different default */
+ if (len == 2)
+ narg = 0; /*Different default */
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;
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;
}
}
&& (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;
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;
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':
{
CRT_Pos end = v->pos;
- if (!narg) narg++;
+ if (!narg)
+ narg++;
- end.x += narg-1;
+ end.x += narg - 1;
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':
break;
default:
- log_f (c->l, "<%s:%d unhandled CSI: \\033%s>", __FILE__,__LINE__,buf);
+ log_f (c->l, "<%s:%d unhandled CSI: \\033%s>", __FILE__, __LINE__,
+ buf);
;
}
break;
default:
- log_f (c->l, "<%s:%d unhandled sequence: \\033%s>", __FILE__,__LINE__,buf);
+ log_f (c->l, "<%s:%d unhandled sequence: \\033%s>", __FILE__, __LINE__,
+ buf);
;
}
}
+void
+vt102_parser_reset (VT102_parser * p)
+{
+ p->in_csi = 0;
+ p->in_escape = 0;
+ p->ignore_until_bell = 0;
+}
+
+
+void
+vt102_reset_state (VT102 * v)
+{
+ vt102_parser_reset (&v->parser);
+
+ v->attr = CRT_ATTR_NORMAL;
+ v->color = CRT_COLOR_NORMAL;
+
+ v->application_keypad_mode = 0;
+
+ v->top_margin = v->screen_start;
+ v->bottom_margin = v->screen_end;
+
+ memset (v->modes, 0, VT102_NMODES);
+ memset (v->private_modes, 0, VT102_NMODES);
+
+ v->private_modes[VT102_PRIVATE_MODE_AUTO_WRAP] = 1;
+ v->private_modes[VT102_PRIVATE_MODE_AUTO_REPEAT] = 1;
+ v->private_modes[VT102_PRIVATE_MODE_SHOW_CURSOR] = 1;
+ v->modes[VT102_MODE_LOCAL_ECHO_OFF] = 1;
+
+ vt102_reset_tabs (v);
+}
+
+
void
vt102_parse_char (Context * c, int ch)
{
VT102 *v = c->v;
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);
+#if 0
+ log_f (c->l, "char %3d %c pc %d %d %d %2d %2d %d", ch, safe_ch (ch),
+ p->ignore_until_bell, p->in_escape, p->in_csi, v->pos.x, v->pos.y,
+ v->pending_wrap);
#endif
- if (p->in_csi)
+
+/* Turn anything non-ascii into '?' */
+ if ((ch != SYM_CHAR_RESET) && (ch != 0xb9) && (ch > 127))
+ {
+ ch = '?';
+ }
+
+
+ if (ch == SYM_CHAR_RESET)
+ {
+ vt102_reset_state (v);
+ }
+ if (p->ignore_until_bell)
+ {
+ if (ch == 7)
+ p->ignore_until_bell = 0;
+ }
+ else if (p->in_csi)
{
p->csi_buf[p->csi_ptr++] = ch;
if (csi_ender (ch) || (p->csi_ptr == VT102_CSI_LEN))
}
else
{
- log_f (c->l, "<%s:%d no dispatcher for sequence starting \\033 \\%03o (ESC %c)>", __FILE__,__LINE__,p->csi_buf[0],safe_ch(p->csi_buf[0]));
+ log_f (c->l,
+ "<%s:%d no dispatcher for sequence starting \\033 \\%03o (ESC %c)>",
+ __FILE__, __LINE__, p->csi_buf[0],
+ safe_ch (p->csi_buf[0]));
}
p->in_csi = 0;
}
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
{
/*EOT*/ case 4:
break;
/*ENQ*/ case 5:
- if (c->t)
- c->t->xmit (c->t, "vt102", 5);
+ if (c->t)
+ c->t->xmit (c->t, "vt102", 5);
break;
/*ACK*/ case 6:
/*BEL*/ case 7:
cmd_show_status (c->d, c);
}
-vt102_parse (Context * c, char *buf, int len)
-{
- while (len--)
- vt102_parse_char (c, *(buf++));
-}
-
-
-void
-vt102_parser_reset (VT102_parser * p)
-{
- p->in_csi = 0;
- p->in_escape = 0;
- p->csi_ptr = 0;
-}
-
-
void
vt102_send (Context * c, uint8_t key)
{
{
VT102_parser *p = &v->parser;
- vt102_parser_reset (p);
- crt_cls (&v->crt);
-
- v->attr = CRT_ATTR_NORMAL;
- v->color = CRT_COLOR_NORMAL;
-
- v->application_keypad_mode = 0;
+ crt_cls (&v->crt);
v->current_line = v->pos;
v->pending_wrap = 0;
v->screen_end.x = VT102_COLS - 1;
v->screen_end.y = VT102_ROWS - 1;
- v->top_margin = v->screen_start;
- v->bottom_margin = v->screen_end;
-
- memset (v->modes, 0, VT102_NMODES);
- memset (v->private_modes, 0, VT102_NMODES);
-
- v->private_modes[VT102_PRIVATE_MODE_AUTO_WRAP] = 1;
- v->private_modes[VT102_PRIVATE_MODE_AUTO_REPEAT] = 1;
- v->private_modes[VT102_PRIVATE_MODE_SHOW_CURSOR] = 1;
- v->modes[VT102_MODE_LOCAL_ECHO_OFF] = 1;
-
vt102_cursor_home (v);
+ vt102_status_line (v, "");
+
vt102_reset_tabs (v);
v->current_line = v->pos;
- vt102_save_state (v);
+ vt102_parser_reset (p);
+ vt102_reset_state (v);
- vt102_status_line (v, "");
+ vt102_save_state (v);
v->last_reg_char = ' ';
-
- v->xn_glitch=0;
-
-}
-
-int
-vt102_dispatch (Context * c)
-{
- char buf[1024];
- int red;
-
- red = c->t->recv (c->t, buf, sizeof (buf));
-
- if (red < 0)
- return -1;
- if (!red)
- return 0;
-
-
- vt102_parse (c, buf, red);
-
- return 0;
-}
-
-
-int
-vt102_dispatch_one (Context * c)
-{
- char buf;
- int red;
-
- red = c->t->recv (c->t, &buf, sizeof (buf));
-
- if (red < 0)
- return -1;
- if (!red)
- return 0;
-
- vt102_parse_char (c, buf);
-
- return 0;
}
VT102 *
v = (VT102 *) malloc (sizeof (VT102));
+ v->xn_glitch = 1;
+
vt102_reset (v);
return v;
}
+void
+vt102_set_ansi (VT102 * v, int ansi)
+{
+ v->xn_glitch = ansi ? 0 : 1;
+}
+
void
vt102_free (VT102 * v)
{