diff options
Diffstat (limited to 'src/com/jcraft/jcterm/EmulatorVT100.java')
-rw-r--r-- | src/com/jcraft/jcterm/EmulatorVT100.java | 634 |
1 files changed, 634 insertions, 0 deletions
diff --git a/src/com/jcraft/jcterm/EmulatorVT100.java b/src/com/jcraft/jcterm/EmulatorVT100.java new file mode 100644 index 0000000..cf2f96a --- /dev/null +++ b/src/com/jcraft/jcterm/EmulatorVT100.java @@ -0,0 +1,634 @@ +/* -*-mode:java; c-basic-offset:2; -*- */ +/* JCTerm + * Copyright (C) 2002,2007 ymnk, JCraft,Inc. + * + * Written by: ymnk<ymnk@jcaft.com> + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * as published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +package com.jcraft.jcterm; + +import java.io.InputStream; + +public class EmulatorVT100 extends Emulator{ + + public EmulatorVT100(Term term, InputStream in){ + super(term, in); + } + + public void setInputStream(InputStream in){ + this.in=in; + } + + public void setTerm(Term term){ + this.term=term; + } + + public void start(){ + reset(); + + int[] intarg=new int[10]; + int intargi=0; + + x=0; + y=char_height; + + byte b; + + try{ + while(true){ + + b=getChar(); + + //System.out.println("@0: "+ new Character((char)b)+"["+Integer.toHexString(b&0xff)+"]"); + + //System.out.println("@0: ry="+ry); + + /* + outputs from infocmp on RedHat8.0 + # Reconstructed via infocmp from file: /usr/share/terminfo/v/vt100 + vt100|vt100-am|dec vt100 (w/advanced video), + am, msgr, xenl, xon, + cols#80, it#8, lines#24, vt#3, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>, + clear=\E[H\E[J$<50>, cr=^M, csr=\E[%i%p1%d;%p2%dr, + cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=^J, + cuf=\E[%p1%dC, cuf1=\E[C$<2>, + cup=\E[%i%p1%d;%p2%dH$<5>, cuu=\E[%p1%dA, + cuu1=\E[A$<2>, ed=\E[J$<50>, el=\E[K$<3>, el1=\E[1K$<3>, + enacs=\E(B\E)0, home=\E[H, ht=^I, hts=\EH, ind=^J, ka1=\EOq, + ka3=\EOs, kb2=\EOr, kbs=^H, kc1=\EOp, kc3=\EOn, kcub1=\EOD, + kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kent=\EOM, kf0=\EOy, + kf1=\EOP, kf10=\EOx, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\EOt, + kf6=\EOu, kf7=\EOv, kf8=\EOl, kf9=\EOw, rc=\E8, + rev=\E[7m$<2>, ri=\EM$<5>, rmacs=^O, rmam=\E[?7l, + rmkx=\E[?1l\E>, rmso=\E[m$<2>, rmul=\E[m$<2>, + rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7, + sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;$<2>, + sgr0=\E[m\017$<2>, smacs=^N, smam=\E[?7h, smkx=\E[?1h\E=, + smso=\E[7m$<2>, smul=\E[4m$<2>, tbc=\E[3g, + */ + /* + am terminal has automatic margnins + msgr safe to move while in standout mode + xenl newline ignored after 80 cols (concept) + xon terminal uses xon/xoff handshake + cols number of columns in a line + it tabs initially every # spaces + lines number of lines on screen of page + vt virstual terminal number(CB/unix) + acsc graphics charset pairs, based on vt100 + bel bell + blink turn on blinking + bold turn on bold(extra bright) mode + clear clear screen and home cursor(P*) + cr carriage return (P)(P*) + csr change region to line #1 to line #2(P) + cub move #1 characters to the left (P) + cub1 move left one space + cud down #1 lines (P*) + cud1 down one line + cuf move to #1 characters to the right. + cuf1 non-destructive space (move right one space) + cup move to row #1 columns #2 + cuu up #1 lines (P*) + cuu1 up one line + ed clear to end of screen (P*) + el clear to end of line (P) + el1 Clear to begining of line + enacs enable alterate char set + home home cursor (if no cup) + ht tab to next 8-space hardware tab stop + hts set a tab in every row, current columns + ind scroll text up + ka1 upper left of keypad + ka3 upper right of keypad + kb2 center of keypad + kbs backspace key + kc1 lower left of keypad + kc3 lower right of keypad + kcub1 left-arrow key + kcud1 down-arrow key + kcuf1 right-arrow key + kcuu1 up-arrow key + kent enter/sekd key + kf0 F0 function key + kf1 F1 function key + kf10 F10 function key + kf2 F2 function key + kf3 F3 function key + kf4 F4 function key + kf5 F5 function key + kf6 F6 function key + kf7 F7 function key + kf8 F8 function key + kf9 F9 function key + rc restore cursor to position of last save_cursor + rev turn on reverse video mode + ri scroll text down (P) + rmacs end alternate character set + rmam turn off automatic margins + rmkx leave 'keybroad_transmit' mode + rmso exit standout mode + rmul exit underline mode + rs2 reset string + sc save current cursor position (P) + sgr define video attribute #1-#9(PG9) + sgr0 turn off all attributes + smacs start alternate character set (P) + smam turn on automatic margins + smkx enter 'keyborad_transmit' mode + smso begin standout mode + smul begin underline mode + tbc clear all tab stops(P) + */ + if(b==0){ + continue; + } + + if(b==0x1b){ + b=getChar(); + + //System.out.println("@1: "+ new Character((char)b)+"["+Integer.toHexString(b&0xff)+"]"); + + if(b=='M'){ // sr \EM sr scroll text down (P) + scroll_reverse(); + continue; + } + + if(b=='D'){ // sf + scroll_forward(); + continue; + } + + if(b=='7'){ + save_cursor(); + continue; + } + + if(b=='('){ + b=getChar(); + if(b=='B'){ + b=getChar(); + if(b==0x1b){ + b=getChar(); + if(b==')'){ + b=getChar(); + if(b=='0'){ // enacs + ena_acs(); + continue; + } + else{ + pushChar((byte)'0'); + } + } + else{ + pushChar((byte)')'); + } + } + else{ + pushChar((byte)0x1b); + } + } + else{ + pushChar((byte)'B'); + } + } + + if(b=='>'){ + b=getChar(); // 0x1b + b=getChar(); // '[' + b=getChar(); // '?' + b=getChar(); // '3' + b=getChar(); // 'l' + b=getChar(); // 0x1b + b=getChar(); // '[' + b=getChar(); // '?' + b=getChar(); // '4' + b=getChar(); // 'l' + b=getChar(); // 0x1b + b=getChar(); // '[' + b=getChar(); // '?' + b=getChar(); // '5' + b=getChar(); // 'l' + b=getChar(); // 0x1b + b=getChar(); // '[' + b=getChar(); // '?' + b=getChar(); // '7' + b=getChar(); // 'h' + b=getChar(); // 0x1b + b=getChar(); // '[' + b=getChar(); // '?' + b=getChar(); // '8' + b=getChar(); // 'h' + + reset_2string(); + continue; + } + + if(b!='['){ + System.out.print("@11: "+new Character((char)b)+"[" + +Integer.toHexString(b&0xff)+"]"); + pushChar(b); + continue; + } + + //System.out.print("@2: "+ new Character((char)b)+"["+Integer.toHexString(b&0xff)+"]"); + + intargi=0; + intarg[intargi]=0; + int digit=0; + + while(true){ + b=getChar(); + //System.out.print("#"+new Character((char)b)+"["+Integer.toHexString(b&0xff)+"]"); + if(b==';'){ + if(digit>0){ + intargi++; + intarg[intargi]=0; + digit=0; + } + continue; + } + + if('0'<=b&&b<='9'){ + intarg[intargi]=intarg[intargi]*10+(b-'0'); + digit++; + continue; + } + + pushChar(b); + break; + } + + b=getChar(); + + //System.out.print("@4: "+ new Character((char)b)+"["+Integer.toHexString(b&0xff)+"]"); + + if(b=='m'){ + /* + b=getChar(); + if(b=='$'){ + b=getChar(); // < + b=getChar(); // 2 + b=getChar(); // > + } + else{ + pushChar(b); + } + */ + + if(digit==0&&intargi==0){ + b=getChar(); + if(b==0x0f){ // sgr0 + exit_attribute_mode(); + continue; + } + else{ // rmso, rmul + exit_underline_mode(); + exit_standout_mode(); + pushChar(b); + continue; + } + } + + for(int i=0; i<=intargi; i++){ + Object fg=null; + Object bg=null; + Object tmp=null; + + switch(intarg[i]){ + case 0: // Reset all attributes + exit_standout_mode(); + continue; + case 1: // Bright // bold + enter_bold_mode(); + continue; + case 2: // Dim + break; + case 4: // Underline + enter_underline_mode(); + continue; + case 5: // Blink + case 8: // Hidden + break; + case 7: // reverse + enter_reverse_mode(); + continue; + case 30: + case 31: + case 32: + case 33: + case 34: + case 35: + case 36: + case 37: + tmp=term.getColor(intarg[i]-30); + if(tmp!=null) + fg=tmp; + break; + case 40: + case 41: + case 42: + case 43: + case 44: + case 45: + case 46: + case 47: + tmp=term.getColor(intarg[i]-40); + if(tmp!=null) + bg=tmp; + break; + default: + break; + } + if(fg!=null) + term.setForeGround(fg); + if(bg!=null) + term.setBackGround(bg); + } + //System.out.println("fg: "+fg+" bg: "+bg); + continue; + } + + if(b=='r'){ // csr + change_scroll_region(intarg[0], intarg[1]); + //System.out.println("r: "+region_y1+", "+region_y2+", intargi="+intargi); + continue; + } + + if(b=='H'){ // cup + /* + b=getChar(); + if(b!='$'){ // home + pushChar(b); + } + else{ + b=getChar(); // < + b=getChar(); // 5 + b=getChar(); // > + } + */ + + if(digit==0&&intargi==0){ + intarg[0]=intarg[1]=1; + } + + //System.out.println("H: "+region_y1+", "+region_y2+", intargi="+intargi); + cursor_address(intarg[0], intarg[1]); + continue; + } + + if(b=='B'){ // cud + parm_down_cursor(intarg[0]); + continue; + } + + if(b=='D'){ // cub + parm_left_cursor(intarg[0]); + continue; + } + + if(b=='C'){ // cuf + if(digit==0&&intargi==0){ + intarg[0]=1; + } + parm_right_cursor(intarg[0]); + continue; + } + + if(b=='K'){ // el + /* + b=getChar(); // + if(b=='$'){ + b=getChar(); // < + b=getChar(); // 3 + b=getChar(); // > + } + else{ + pushChar(b); + } + */ + + if(digit==0&&intargi==0){ // el + clr_eol(); + } + else{ // el1 + clr_bol(); + } + continue; + } + + if(b=='J'){ + //for(int i=0; i<intargi; i++){ System.out.print(intarg[i]+" ");} + //System.out.println(intarg[0]+"<- intargi="+intargi); + clr_eos(); + continue; + } + + if(b=='A'){ // cuu + if(digit==0&&intargi==0){ + intarg[0]=1; + } + parm_up_cursor(intarg[0]); + continue; + } + + if(b=='?'){ + b=getChar(); + if(b=='1'){ + b=getChar(); + if(b=='l'||b=='h'){ + b=getChar(); + if(b==0x1b){ + b=getChar(); + if(b=='>'|| // rmkx , leave 'keybroad_transmit' mode + b=='='){ // smkx , enter 'keyborad_transmit' mode + // TODO + continue; + } + } + } + else if(b=='h'){ + b=getChar(); + if(b==0x1b){ + b=getChar(); + if(b=='='){ // smkx enter 'keyborad_transmit' mode + continue; + } + } + } + } + else if(b=='7'){ + b=getChar(); + if(b=='h'){ // smam + // TODO + //System.out.println("turn on automatic magins"); + continue; + } + else if(b=='l'){ // rmam + // TODO + //System.out.println("turn off automatic magins"); + continue; + } + pushChar(b); + b='7'; + } + else{ + } + } + + if(b=='h'){ // kh \Eh home key + continue; + } + + System.out.println("unknown "+Integer.toHexString(b&0xff)+" " + +new Character((char)b)+", "+intarg[0]+", "+intarg[1]+", " + +intarg[2]+",intargi="+intargi); + continue; + } + + if(b==0x07){ // bel ^G + bell(); + continue; + } + + if(b==0x09){ // ht(^I) + tab(); + continue; + } + + if(b==0x0f){ // rmacs ^O // end alternate character set (P) + exit_alt_charset_mode(); + continue; + } + + if(b==0x0e){ // smacs ^N // start alternate character set (P) + enter_alt_charset_mode(); + continue; + } + + if(b==0x0d){ + carriage_return(); + continue; + } + + if(b==0x08){ + cursor_left(); + continue; + } + + if(b==0x0a){ // '\n' + //System.out.println("x="+x+",y="+y); + cursor_down(); + //check_region(); + continue; + } + + if(b!=0x0a){ // !'\n' + pushChar(b); + draw_text(); + continue; + } + } + } + catch(Exception e){ + } + } + + private static byte[] ENTER= {(byte)0x0d}; + private static byte[] UP= {(byte)0x1b, (byte)0x4f, (byte)0x41}; + private static byte[] DOWN= {(byte)0x1b, (byte)0x4f, (byte)0x42}; + private static byte[] RIGHT= {(byte)0x1b, (byte)/*0x5b*/0x4f, (byte)0x43}; + private static byte[] LEFT= {(byte)0x1b, (byte)/*0x5b*/0x4f, (byte)0x44}; + private static byte[] F1= {(byte)0x1b, (byte)0x4f, (byte)'P'}; + private static byte[] F2= {(byte)0x1b, (byte)0x4f, (byte)'Q'}; + private static byte[] F3= {(byte)0x1b, (byte)0x4f, (byte)'R'}; + private static byte[] F4= {(byte)0x1b, (byte)0x4f, (byte)'S'}; + private static byte[] F5= {(byte)0x1b, (byte)0x4f, (byte)'t'}; + private static byte[] F6= {(byte)0x1b, (byte)0x4f, (byte)'u'}; + private static byte[] F7= {(byte)0x1b, (byte)0x4f, (byte)'v'}; + private static byte[] F8= {(byte)0x1b, (byte)0x4f, (byte)'I'}; + private static byte[] F9= {(byte)0x1b, (byte)0x4f, (byte)'w'}; + private static byte[] F10= {(byte)0x1b, (byte)0x4f, (byte)'x'}; + private static byte[] tab= {(byte)0x09}; + + public byte[] getCodeENTER(){ + return ENTER; + } + + public byte[] getCodeUP(){ + return UP; + } + + public byte[] getCodeDOWN(){ + return DOWN; + } + + public byte[] getCodeRIGHT(){ + return RIGHT; + } + + public byte[] getCodeLEFT(){ + return LEFT; + } + + public byte[] getCodeF1(){ + return F1; + } + + public byte[] getCodeF2(){ + return F2; + } + + public byte[] getCodeF3(){ + return F3; + } + + public byte[] getCodeF4(){ + return F4; + } + + public byte[] getCodeF5(){ + return F5; + } + + public byte[] getCodeF6(){ + return F6; + } + + public byte[] getCodeF7(){ + return F7; + } + + public byte[] getCodeF8(){ + return F8; + } + + public byte[] getCodeF9(){ + return F9; + } + + public byte[] getCodeF10(){ + return F10; + } + + public byte[] getCodeTAB(){ + return tab; + } +} |