chiark / gitweb /
*** empty log message ***
authorjames <james>
Sun, 3 Feb 2008 23:36:41 +0000 (23:36 +0000)
committerjames <james>
Sun, 3 Feb 2008 23:36:41 +0000 (23:36 +0000)
src/vt102.c [new file with mode: 0644]
src/vt102.h [new file with mode: 0644]

diff --git a/src/vt102.c b/src/vt102.c
new file mode 100644 (file)
index 0000000..80b636c
--- /dev/null
@@ -0,0 +1,261 @@
+/*
+ * vt102.c:
+ *
+ * Copyright (c) 2008 James McKenzie <james@fishsoup.dhs.org>,
+ * All rights reserved.
+ *
+ */
+
+static char rcsid[] = "$Id$";
+
+/*
+ * $Log$
+ * Revision 1.1  2008/02/03 23:36:41  james
+ * *** empty log message ***
+ *
+ */
+
+
+/* Termcap he say:
+
+vt102|dec vt102:\
+        :mi:\
+        :al=\E[L:dc=\E[P:dl=\E[M:ei=\E[4l:im=\E[4h:tc=vt100:
+
+vt100|vt100-am|dec vt100 (w/advanced video):\
+        :am:bs:ms:xn:xo:\
+        :co#80:it#8:li#24:vt#3:\
+        :DO=\E[%dB:LE=\E[%dD:RA=\E[?7l:RI=\E[%dC:SA=\E[?7h:\
+        :UP=\E[%dA:\
+        :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+        :ae=^O:as=^N:bl=^G:cb=\E[1K:cd=\E[J:ce=\E[K:cl=\E[H\E[J:\
+        :cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:ct=\E[3g:do=^J:\
+        :eA=\E(B\E)0:ho=\E[H:kb=^H:kd=\EOB:ke=\E[?1l\E>:kl=\EOD:\
+        :kr=\EOC:ks=\E[?1h\E=:ku=\EOA:le=^H:mb=\E[5m:md=\E[1m:\
+        :me=\E[m\017:mr=\E[7m:nd=\E[C:rc=\E8:\
+        :rs=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:sc=\E7:se=\E[m:\
+        :sf=^J:so=\E[7m:sr=\EM:st=\EH:ta=^I:ue=\E[m:up=\E[A:\
+        :us=\E[4m:tc=vt100+fnkeys:
+
+vt100+fnkeys|dec vt100 numeric keypad:\
+        :k0=\EOy:k5=\EOt:k6=\EOu:k7=\EOv:k8=\EOl:k9=\EOw:k;=\EOx:\
+        :tc=vt100+pfkeys:
+
+vt100+pfkeys|dec vt100 numeric keypad:\
+        :@8=\EOM:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:tc=vt100+keypad:
+
+vt100+keypad|dec vt100 numeric keypad no fkeys:\
+        :K1=\EOq:K2=\EOr:K3=\EOs:K4=\EOp:K5=\EOn:
+
+*/
+
+/*
+so the parser needs to be able to at least do
+CTRL-H
+ESC[%dA
+ESC[%dB
+ESC[%dC
+ESC[%dD
+ESC[?7l
+ESC[?7h
+CTRL-O
+CTRL-N
+CTRL-G
+ESC[1K
+ESC[J
+ESC[K
+ESC[H
+ESC[J
+ESC[%d;%dh
+CTRL-M
+ESC[%d;%dr
+ESC[3g
+CTRL-J
+ESC(B
+ESC)0
+ESC[5m
+ESC[1m
+ESC[m CTRL-O
+ESC[7m
+ESC8
+ESC> 
+ESC[?3l 
+ESC[?4l 
+ESC[?5l
+ESC[?7h
+ESC[?8h
+ESC7
+ESCM
+ESCH
+CTRL-I
+ESC[4m
+ESC[L
+ESC[P
+ESC[M
+ESC[4l
+ESC[4h
+*/
+
+
+static inline int
+csi_ender (int c)
+{
+  if ((c >= 'a') && (c <= 'z'))
+    return 1;
+  if ((c >= 'A') && (c <= 'Z'))
+    return 1;
+  return 0;
+}
+
+static inline int
+csi_starter (int c)
+{
+  switch (c)
+    {
+    case '[':
+    case '(':
+    case ')':
+      return 1;
+    }
+  return 0;
+}
+
+void vt102_cursor_normalize(VT102 *v,int wrap,int scroll)
+{
+       if (v->pos.x<-1)   /*don't wrap backwards*/
+               c->pos.x=0;
+
+       if (v->pos.x>=CRT_COLS)  {
+       if (wrap) {
+               c->pos.x=0;
+               c->pos.y++;
+       } else {
+               c->pos.x=CRT_COLS-1;
+       }
+       } 
+
+       if (v->pos.y<0)  
+               c->pos.y=0
+
+       if (v->pos.y>=CRT_ROWS)  {
+       if (scroll) 
+               vt102_scroll(v,0,CRT_ROWS-1);
+               c->pos.y=CRT_ROWS-1;
+       } 
+}
+
+       
+void vt102_cursor_motion(VT102 *v,int x,int y,int wrap,scroll)
+{
+while (x>0) {
+       x--;
+       v->pos.x++;
+       vt102_cursor_normalize(v,wrap,scroll);
+}
+               
+while (x<0) {
+       x++;
+       v->pos.x--;
+       vt102_cursor_normalize(v,wrap,scroll);
+}
+       
+while (y>0) {
+       y--;
+       v->pos.y++;
+       vt102_cursor_normalize(v,wrap,scroll);
+}
+               
+while (y<0) {
+       y++;
+       v->pos.y--;
+       vt102_cursor_normalize(v,wrap,scroll);
+}
+}      
+
+
+void
+vt102_parse_char (VT102 * v, int c)
+{
+  VT102_parser *p = &v->p;
+
+
+  if (p->in_csi)
+    {
+      p->csi_buf[p->csi_ptr++] = c;
+      if (csi_ender (c) || (p->csi_ptr == VT102_CSI_LEN))
+        {
+          vt102_parse_csi (v, p->csi_buf, p->csi_ptr);
+          p->in_csi = 0;
+        }
+    }
+  else if (p->in_escape)
+    {
+      if (csi_starter (c))
+        {
+          p->csi_ptr = 0;
+          p->csi_buf[p->csi_ptr++] = c;
+          p->in_csi++;
+          p->in_escape = 0;
+        }
+      else
+        {
+          p->in_escape = 0;
+          vt102_parse_esc (v, c);
+        }
+    }
+  else
+    {
+
+      switch (c)
+        {
+         /*NUL*/ case 0:
+         /*SOH*/ case 1:
+         /*STX*/ case 2:
+         /*ETX*/ case 3:
+         /*EOT*/ case 4:
+         /*ENQ*/ case 5:
+         /*ACK*/ case 6:
+         /*BEL*/ case 7:
+         /*BS*/ case 8:
+               vt102_cursor_motion(v,-1,0,0,0);
+          break;
+         /*HT*/ case 9:
+          break;
+         /*LF*/ case 10:
+          break;
+         /*VT*/ case 11:
+          break;
+         /*FF*/ case 12:
+          break;
+         /*CR*/ case 13:
+          break;
+         /*SO*/ case 14:
+         /*SI*/ case 15:
+         /*DLE*/ case 16:
+        /*DC1*/ case 17:
+        /*DC2*/ case 18:
+        /*DC3*/ case 19:
+        /*DC4*/ case 20:
+         /*NAK*/ case 21:
+         /*SYN*/ case 22:
+         /*ETB*/ case 23:
+         /*CAN*/ case 24:
+         /*EM*/ case 25:
+         /*SUB*/ case 26:
+          break;
+         /*ESC*/ case 27:
+          p->in_escape++;
+          return;
+         /*FS*/ case 28:
+         /*GS*/ case 29:
+         /*RS*/ case 30:
+         /*US*/ case 31:
+         /*DEL*/ case 127:
+          break;
+        /*regular character*/ default:
+               v->crt->screen[CRT_ADDR_POS(&v->pos)].chr=c;
+               v->crt->screen[CRT_ADDR_POS(&v->pos)].attr=v->attr;
+               vt102_cursor_motion(v,1,0);
+        }
+    }
+}
diff --git a/src/vt102.h b/src/vt102.h
new file mode 100644 (file)
index 0000000..e5b62a5
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * vt102.h:
+ *
+ * Copyright (c) 2008 James McKenzie <james@fishsoup.dhs.org>,
+ * All rights reserved.
+ *
+ */
+
+/*
+ * $Id$
+ */
+
+/*
+ * $Log$
+ * Revision 1.1  2008/02/03 23:36:41  james
+ * *** empty log message ***
+ *
+ */
+
+#ifndef __VT102_H__
+#define __VT102_H__
+
+#define VT102_CSI_LEN 128
+
+typedef struct
+{
+  int in_escape;
+  int in_csi;
+  int csi_ptr;
+  char csi_buf[VT102_CSI_LEN];
+} VT102_parser;
+
+typedef struct
+{
+  VT102_parser p;
+  int attr;
+  CRT crt;
+  CRT_Pos p;
+
+
+
+} VT102;
+
+
+#endif /* __VT102_H__ */