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