X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fvt102.c;h=9b316cefb6b94ee920ca96089d738f7f9b257931;hb=5cded6a34ead3205baf1a45ed5adbee24ebec685;hp=7a1a0982f7a384e3a45dcc2a031098103e64841a;hpb=11313f344099e326aaf010fb9781b921df3b1967;p=sympathy.git diff --git a/src/vt102.c b/src/vt102.c index 7a1a098..9b316ce 100644 --- a/src/vt102.c +++ b/src/vt102.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $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 *** * @@ -272,10 +275,13 @@ ESC+B 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 @@ -429,7 +435,8 @@ vt102_cursor_advance_line (Context * c) 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; } @@ -483,7 +490,7 @@ vt102_cursor_advance (Context * c) } v->pending_wrap++; if (!c->v->xn_glitch) - vt102_do_pending_wrap(c); + vt102_do_pending_wrap (c); } @@ -920,7 +927,8 @@ 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,v->color); + crt_scroll_up (&v->crt, v->top_margin, v->bottom_margin, 1, + v->color); } else { @@ -933,7 +941,8 @@ 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,v->color); + crt_scroll_down (&v->crt, v->top_margin, v->bottom_margin, 1, + v->color); } else { @@ -952,8 +961,12 @@ vt102_parse_esc (Context * c, int ch) 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)); ; } @@ -1039,18 +1052,19 @@ vt102_parse_csi (Context * c, char *buf, int len) 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,v->color); + 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,v->color); + 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,v->color); + crt_erase (&v->crt, v->screen_start, v->screen_end, 1, + v->color); break; } break; @@ -1064,13 +1078,13 @@ vt102_parse_csi (Context * c, char *buf, int len) switch (narg) { case 0: - crt_erase (&v->crt, v->pos, le, 1,v->color); + crt_erase (&v->crt, v->pos, le, 1, v->color); break; case 1: - crt_erase (&v->crt, ls, v->pos, 1,v->color); + crt_erase (&v->crt, ls, v->pos, 1, v->color); break; case 2: - crt_erase (&v->crt, ls, le, 1,v->color); + crt_erase (&v->crt, ls, le, 1, v->color); break; } } @@ -1081,7 +1095,8 @@ 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,v->color); + crt_scroll_down (&v->crt, v->pos, v->bottom_margin, 1, + v->color); } break; @@ -1092,7 +1107,8 @@ 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,v->color); + crt_scroll_up (&v->crt, v->pos, v->bottom_margin, 1, + v->color); } } break; @@ -1107,23 +1123,26 @@ 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,v->color); + 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,v->color); + 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,v->color); + crt_erase (&v->crt, v->pos, end, 1, v->color); } break; case 'Z': @@ -1206,13 +1225,15 @@ vt102_parse_csi (Context * c, char *buf, int len) 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); ; } @@ -1244,13 +1265,14 @@ 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_reset_state (VT102 * v) { - vt102_parser_reset(&v->parser); + vt102_parser_reset (&v->parser); v->attr = CRT_ATTR_NORMAL; v->color = CRT_COLOR_NORMAL; @@ -1278,14 +1300,29 @@ 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 %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); +#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 (ch==SYM_CHAR_RESET) { - vt102_reset_state(v); - } else 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)) @@ -1300,7 +1337,10 @@ vt102_parse_char (Context * c, int ch) } 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; } @@ -1320,12 +1360,12 @@ vt102_parse_char (Context * c, int ch) vt102_parse_esc (c, ch); } } - else if (ch==0x9b) /*One byte CSI*/ + else if (ch == 0x9b) /*One byte CSI */ { - p->csi_ptr = 0; - p->csi_buf[p->csi_ptr++] = '['; - p->in_csi++; - } + p->csi_ptr = 0; + p->csi_buf[p->csi_ptr++] = '['; + p->in_csi++; + } else { @@ -1338,8 +1378,8 @@ vt102_parse_char (Context * c, int ch) /*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: @@ -1580,8 +1620,6 @@ vt102_reset (VT102 * v) { VT102_parser *p = &v->parser; - vt102_parser_reset (p); - vt102_reset_state(v); crt_cls (&v->crt); v->current_line = v->pos; @@ -1598,10 +1636,14 @@ vt102_reset (VT102 * v) vt102_reset_tabs (v); v->current_line = v->pos; + vt102_parser_reset (p); + vt102_reset_state (v); + vt102_save_state (v); v->last_reg_char = ' '; } + VT102 * vt102_new (void) { @@ -1609,7 +1651,7 @@ vt102_new (void) v = (VT102 *) malloc (sizeof (VT102)); - v->xn_glitch=1; + v->xn_glitch = 1; vt102_reset (v); @@ -1617,9 +1659,10 @@ vt102_new (void) return v; } -void vt102_set_ansi(VT102 *v,int ansi) +void +vt102_set_ansi (VT102 * v, int ansi) { -v->xn_glitch=ansi ? 0:1; + v->xn_glitch = ansi ? 0 : 1; } void