/* * vt102.c: * * Copyright (c) 2008 James McKenzie , * All rights reserved. * */ static char rcsid[] = "$Id$"; /* * $Log$ * Revision 1.4 2008/02/04 05:45:55 james * :: * * Revision 1.3 2008/02/04 02:05:06 james * *** empty log message *** * * Revision 1.2 2008/02/04 01:32:39 james * *** empty log message *** * * 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-G CTRL-H CTRL-I CTRL-J CTRL-M CTRL-N CTRL-O ESC7 ESC8 ESCH ESCM ESC> ESC[%dA ESC[%dB ESC[%dC ESC[%dD ESC[H ESC[%d;%dH ESC[J ESC[K ESC[1K ESC[L ESC[M ESC[P ESC[3g ESC[4h ESC[4l ESC[m ESC[1m ESC[4m ESC[5m ESC[7m ESC[%d;%dr ESC(B ESC)0 ESC[?3l ESC[?4l ESC[?5l ESC[?7h ESC[?7h ESC[?7l ESC[?8h */ #include "project.h" 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_scroll(VT102 *v,int start,int end) { } void vt102_cursor_normalize (VT102 * v, int wrap, int scroll) { if (v->pos.x < -1) /*don't wrap backwards */ v->pos.x = 0; if (v->pos.x >= CRT_COLS) { if (wrap) { v->pos.x = 0; v->pos.y++; } else { v->pos.x = CRT_COLS - 1; } } if (v->pos.y < 0) v->pos.y = 0; if (v->pos.y >= CRT_ROWS) { if (scroll) vt102_scroll (v, 0, CRT_ROWS - 1); v->pos.y = CRT_ROWS - 1; } } void vt102_cursor_motion (VT102 * v, int x, int y, int wrap, int 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_esc(VT102 *v,int c) { fprintf(stderr, "ESC %d(%c)\n",c,c); } void vt102_parse_csi(VT102 *v,char *buf,int len) { buf[len]=0; fprintf(stderr, "CSI %s\n",buf); } void vt102_parse_char (VT102 * v, int c) { VT102_parser *p = &v->parser; fprintf(stderr,"%c pc %d %d %d %d %d\n",c,c,p->in_csi,p->in_escape,v->pos.x,v->pos.y); 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: vt102_cursor_motion (v, 0, 1, 0, 1); break; /*VT*/ case 11: break; /*FF*/ case 12: break; /*CR*/ case 13: v->pos.x = 0; 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, 1, 1); } } v->crt.pos=v->pos; }