From: james Date: Sun, 3 Feb 2008 23:36:41 +0000 (+0000) Subject: *** empty log message *** X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=sympathy.git;a=commitdiff_plain;h=c36d5e9da077b09450d3c21a5bf777fb2972bd64 *** empty log message *** --- 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 , + * 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 , + * 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__ */