diff options
Diffstat (limited to 'src/vt102.c')
-rw-r--r-- | src/vt102.c | 181 |
1 files changed, 133 insertions, 48 deletions
diff --git a/src/vt102.c b/src/vt102.c index da3a587..8b61929 100644 --- a/src/vt102.c +++ b/src/vt102.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.7 2008/02/06 11:30:37 james + * *** empty log message *** + * * Revision 1.6 2008/02/05 01:11:46 james * *** empty log message *** * @@ -236,10 +239,85 @@ vt102_delete_from_line (VT102 * v, CRT_Pos p) &v->crt.screen[CRT_ADDR_POS (&p) + 1], sizeof (CRT_CA) * n); } - v->crt.screen[CRT_ADDR (v->bottom_margin.x, p.y)].chr = ' '; + v->crt.screen[CRT_ADDR (p.y, v->bottom_margin.x)].chr = ' '; /*But not attr due to vt102 bug*/ } +void +vt102_change_mode (VT102 * v, int private, char *ns, int set) +{ + int m; + + + if (*ns) + { + m = atoi (ns); + } + else + { + m = 1; + } + + if (m < 0) + return; + if (m >= VT102_NMODES) + return; + + if (private) + v->private_modes[m] = set; + else + v->modes[m] = set; + + fprintf (stderr, "mode set=%d private=%d num=%d\n", set, private, m); +} + +void +vt102_parse_mode_string (VT102 * v, char *buf, int len) +{ + int private = 0; + char last = buf[len - 1]; + char num[4]; + int o; + + memset (num, 0, sizeof (num)); + o = sizeof (num) - 1; + + len--; + + if (*buf == '?') + { + private++; + buf++; + len--; + } + + if (len < 0) + return; + + while (len--) + { + if (*buf == ';') + { + vt102_change_mode (v, private, &num[o], last == 'h'); + memset (num, 0, sizeof (num)); + o = sizeof (num) - 1; + buf++; + continue; + } + + num[0] = num[1]; + num[1] = num[2]; + num[2] = *buf; + + if (o) + o--; + + buf++; + } + + vt102_change_mode (v, private, &num[o], last == 'h'); + +} void vt102_parse_esc (VT102 * v, int c) @@ -262,7 +340,7 @@ vt102_parse_csi (VT102 * v, char *buf, int len) buf[len - 1] = 0; #endif - if (len>2) + if (len > 2) { narg = atoi (arg); } @@ -300,7 +378,7 @@ vt102_parse_csi (VT102 * v, char *buf, int len) vt102_cursor_normalize (v, 0, 0); break; case 'J': - fprintf(stderr,"OCTOPUS %d\n",narg); + fprintf (stderr, "OCTOPUS %d\n", narg); switch (narg) { case 1: @@ -315,27 +393,24 @@ vt102_parse_csi (VT102 * v, char *buf, int len) { CRT_Pos ls = { 0, v->pos.y }; CRT_Pos le = { VT102_COLS - 1, v->pos.y }; - if (len==2) + if (len == 2) narg = 0; /*Different default */ switch (narg) { case 0: - fprintf(stderr,"FISH %d %d -> %d %d\n", - v->pos.x,v->pos.y, - le.x,le.y); + fprintf (stderr, "FISH %d %d -> %d %d\n", + v->pos.x, v->pos.y, le.x, le.y); crt_erase (&v->crt, v->pos, le, 1); break; case 1: - fprintf(stderr,"SOUP %d %d -> %d %d\n", - ls.x,ls.y, - v->pos.x,v->pos.y); + fprintf (stderr, "SOUP %d %d -> %d %d\n", + ls.x, ls.y, v->pos.x, v->pos.y); crt_erase (&v->crt, ls, v->pos, 1); break; case 2: - fprintf(stderr,"TREE %d %d -> %d %d\n", - ls.x,ls.y, - le.x,le.y); + fprintf (stderr, "TREE %d %d -> %d %d\n", + ls.x, ls.y, le.x, le.y); crt_erase (&v->crt, ls, le, 1); break; } @@ -364,41 +439,50 @@ vt102_parse_csi (VT102 * v, char *buf, int len) } break; - case 'g': - case 'h': - case 'l': - fprintf (stderr, "C: CSI %s buf[0]=%c\n", buf,buf[0]); - break; - - case 'm': - //horror of horrors parsing the ; - break; - case 'r': - v->top_margin=v->screen_start; - v->bottom_margin=v->screen_end; - - if ((len>2) && (ptr=index(arg,';'))) { - ptr++; - v->top_margin.y=narg-1; - v->bottom_margin.y=atoi(ptr)-1; - } - - if (v->top_margin.y<v->screen_start.y) v->top_margin.y=v->screen_start.y; - if (v->top_margin.y>v->screen_end.y) v->top_margin.y=v->screen_end.y; - if (v->bottom_margin.y<v->screen_start.y) v->bottom_margin.y=v->screen_start.y; - if (v->bottom_margin.y>v->screen_end.y) v->bottom_margin.y=v->screen_end.y; - - fprintf(stderr,"D: %d %d\n",v->top_margin.y,v->bottom_margin.y); - - v->pos=v->top_margin; - break; + case 'g': + fprintf (stderr, "C: CSI %s buf[0]=%c\n", buf, buf[0]); + break; + + case 'h': + case 'l': + fprintf (stderr, "D: CSI %s buf[0]=%c\n", buf, buf[0]); + vt102_parse_mode_string (v, &buf[1], len - 1); + break; + + case 'm': + //horror of horrors parsing the ; + break; + case 'r': + v->top_margin = v->screen_start; + v->bottom_margin = v->screen_end; + + if ((len > 2) && (ptr = index (arg, ';'))) + { + ptr++; + v->top_margin.y = narg - 1; + v->bottom_margin.y = atoi (ptr) - 1; + } + + if (v->top_margin.y < v->screen_start.y) + v->top_margin.y = v->screen_start.y; + if (v->top_margin.y > v->screen_end.y) + v->top_margin.y = v->screen_end.y; + if (v->bottom_margin.y < v->screen_start.y) + v->bottom_margin.y = v->screen_start.y; + if (v->bottom_margin.y > v->screen_end.y) + v->bottom_margin.y = v->screen_end.y; + + fprintf (stderr, "D: %d %d\n", v->top_margin.y, v->bottom_margin.y); + + v->pos = v->top_margin; + break; default: - fprintf (stderr, "A: CSI %s buf[0]=%c\n", buf,buf[0]); + fprintf (stderr, "A: CSI %s buf[0]=%c\n", buf, buf[0]); } break; default: - fprintf (stderr, "B: CSI %s buf[0]=%c\n", buf,buf[0]); + fprintf (stderr, "B: CSI %s buf[0]=%c\n", buf, buf[0]); } @@ -429,8 +513,8 @@ vt102_parse_char (VT102 * v, int c) VT102_parser *p = &v->parser; #if 0 - fprintf (stderr, "%c pc %d %d %d %d %d\n", c, c, p->in_csi, p->in_escape, - v->pos.x, v->pos.y); + fprintf (stderr, "%c pc %d %d %d %d %d\n", (c > 31) ? 32 : c, c, + p->in_csi, p->in_escape, v->pos.x, v->pos.y); #endif if (p->in_csi) { @@ -469,13 +553,14 @@ vt102_parse_char (VT102 * v, int c) /*ENQ*/ case 5: /*ACK*/ case 6: /*BEL*/ case 7: + break; /*BS*/ case 8: vt102_cursor_motion (v, -1, 0, 1); break; /*HT*/ case 9: - v->pos.x+=8; - v->pos.x&=~7; - vt102_cursor_normalize(v,1,1); + v->pos.x += 8; + v->pos.x &= ~7; + vt102_cursor_normalize (v, 1, 1); break; /*LF*/ case 10: /*VT*/ case 11: |