aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorjames <>2008-02-03 23:36:41 +0000
committerjames <>2008-02-03 23:36:41 +0000
commitba58c87c457aa20cfebcc69374736ee8e7e3c470 (patch)
tree838b435bd7691eb13a1f7b0151575adc8ac992cf /src
parent148184f54c08d931007fc31cfd26ac88cc86e493 (diff)
downloadsympathy-ba58c87c457aa20cfebcc69374736ee8e7e3c470.tar.gz
sympathy-ba58c87c457aa20cfebcc69374736ee8e7e3c470.tar.bz2
sympathy-ba58c87c457aa20cfebcc69374736ee8e7e3c470.zip
*** empty log message ***
Diffstat (limited to 'src')
-rw-r--r--src/vt102.c261
-rw-r--r--src/vt102.h45
2 files changed, 306 insertions, 0 deletions
diff --git a/src/vt102.c b/src/vt102.c
new file mode 100644
index 0000000..80b636c
--- /dev/null
+++ b/src/vt102.c
@@ -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
index 0000000..e5b62a5
--- /dev/null
+++ b/src/vt102.h
@@ -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__ */