aboutsummaryrefslogtreecommitdiffstats
path: root/src/com
diff options
context:
space:
mode:
authorKenny Root <kenny@the-b.org>2007-11-21 05:32:39 +0000
committerKenny Root <kenny@the-b.org>2007-11-21 05:32:39 +0000
commitd6764b7763e7857273b65048b4eb37a3c65efade (patch)
tree4e84d4d9327d8a8de685fd0f181208c82e1cb9ad /src/com
parent4d94be3c05a341c18396f45945d86d61ca86dec4 (diff)
downloadconnectbot-d6764b7763e7857273b65048b4eb37a3c65efade.tar.gz
connectbot-d6764b7763e7857273b65048b4eb37a3c65efade.tar.bz2
connectbot-d6764b7763e7857273b65048b4eb37a3c65efade.zip
Merging back in the jcterm branch
Diffstat (limited to 'src/com')
-rw-r--r--src/com/jcraft/jcterm/Emulator.java416
-rw-r--r--src/com/jcraft/jcterm/EmulatorVT100.java634
-rw-r--r--src/com/jcraft/jcterm/Term.java80
3 files changed, 1130 insertions, 0 deletions
diff --git a/src/com/jcraft/jcterm/Emulator.java b/src/com/jcraft/jcterm/Emulator.java
new file mode 100644
index 0000000..7723738
--- /dev/null
+++ b/src/com/jcraft/jcterm/Emulator.java
@@ -0,0 +1,416 @@
+/* -*-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;
+import java.io.IOException;
+
+public abstract class Emulator{
+ Term term=null;
+ InputStream in=null;
+
+ public Emulator(Term term, InputStream in){
+ this.term=term;
+ this.in=in;
+ }
+
+ public abstract void start();
+
+ public abstract byte[] getCodeENTER();
+
+ public abstract byte[] getCodeUP();
+
+ public abstract byte[] getCodeDOWN();
+
+ public abstract byte[] getCodeRIGHT();
+
+ public abstract byte[] getCodeLEFT();
+
+ public abstract byte[] getCodeF1();
+
+ public abstract byte[] getCodeF2();
+
+ public abstract byte[] getCodeF3();
+
+ public abstract byte[] getCodeF4();
+
+ public abstract byte[] getCodeF5();
+
+ public abstract byte[] getCodeF6();
+
+ public abstract byte[] getCodeF7();
+
+ public abstract byte[] getCodeF8();
+
+ public abstract byte[] getCodeF9();
+
+ public abstract byte[] getCodeF10();
+
+ public abstract byte[] getCodeTAB();
+
+ public void reset(){
+ term_width=term.getColumnCount();
+ term_height=term.getRowCount();
+ char_width=term.getCharWidth();
+ char_height=term.getCharHeight();
+ region_y1=1;
+ region_y2=term_height;
+ }
+
+ byte[] buf=new byte[1024];
+ int bufs=0;
+ int buflen=0;
+
+ byte getChar() throws java.io.IOException{
+ if(buflen==0){
+ fillBuf();
+ }
+ buflen--;
+
+ // System.out.println("getChar: "+new Character((char)buf[bufs])+"["+Integer.toHexString(buf[bufs]&0xff)+"]");
+
+ return buf[bufs++];
+ }
+
+ void fillBuf() throws java.io.IOException{
+ buflen=bufs=0;
+ buflen=in.read(buf, bufs, buf.length-bufs);
+ /*
+ System.out.println("fillBuf: ");
+ for(int i=0; i<buflen; i++){
+ byte b=buf[i];
+ System.out.print(new Character((char)b)+"["+Integer.toHexString(b&0xff)+"], ");
+ }
+ System.out.println("");
+ */
+ if(buflen<=0){
+ buflen=0;
+ throw new IOException("fillBuf");
+ }
+ }
+
+ void pushChar(byte foo) throws java.io.IOException{
+ //System.out.println("pushChar: "+new Character((char)foo)+"["+Integer.toHexString(foo&0xff)+"]");
+ buflen++;
+ buf[--bufs]=foo;
+ }
+
+ int getASCII(int len) throws java.io.IOException{
+ //System.out.println("bufs="+bufs+", buflen="+buflen+", len="+len);
+ if(buflen==0){
+ fillBuf();
+ }
+ if(len>buflen)
+ len=buflen;
+ int foo=len;
+ byte tmp;
+ while(len>0){
+ tmp=buf[bufs++];
+ if(0x20<=tmp&&tmp<=0x7f){
+ buflen--;
+ len--;
+ continue;
+ }
+ bufs--;
+ break;
+ }
+ //System.out.println(" return "+(foo-len));
+ return foo-len;
+ }
+
+ protected int term_width=80;
+ protected int term_height=24;
+
+ protected int x=0;
+ protected int y=0;
+
+ protected int char_width;
+ protected int char_height;
+
+ private int region_y2;
+ private int region_y1;
+
+ protected int tab=8;
+
+ // Reverse scroll
+ protected void scroll_reverse(){
+ term.draw_cursor();
+ term.scroll_area(0, (region_y1-1)*char_height, term_width*char_width,
+ (region_y2-region_y1)*char_height, 0, char_height);
+ term.clear_area(x, y-char_height, term_width*char_width, y);
+ term.redraw(0, 0, term_width*char_width, term_height*char_height
+ -char_height);
+ //term.setCursor(x, y);
+ term.draw_cursor();
+ }
+
+ // Normal scroll one line
+ protected void scroll_forward(){
+ term.draw_cursor();
+ term.scroll_area(0, (region_y1-1)*char_height, term_width*char_width,
+ (region_y2-region_y1+1)*char_height, 0, -char_height);
+ term.clear_area(0, region_y2*char_height-char_height,
+ term_width*char_width, region_y2*char_height);
+ term.redraw(0, (region_y1-1)*char_height, term_width*char_width, (region_y2
+ -region_y1+1)
+ *char_height);
+ term.draw_cursor();
+ }
+
+ // Save cursor position
+ protected void save_cursor(){
+ // TODO
+ //System.out.println("save current cursor position");
+ }
+
+ // Enable alternate character set
+ protected void ena_acs(){
+ // TODO
+ //System.out.println("enable alterate char set");
+ }
+
+ protected void exit_alt_charset_mode(){
+ // TODO
+ //System.out.println("end alternate character set (P)");
+ }
+
+ protected void enter_alt_charset_mode(){
+ // TODO
+ //System.out.println("start alternate character set (P)");
+ }
+
+ protected void reset_2string(){
+ // TODO
+ // rs2(reset string)
+ }
+
+ protected void exit_attribute_mode(){
+ // TODO
+ //System.out.println("turn off all attributes");
+ term.resetAllAttributes();
+ }
+
+ protected void exit_standout_mode(){
+ term.resetAllAttributes();
+ }
+
+ protected void exit_underline_mode(){
+ // TODO
+ }
+
+ protected void enter_bold_mode(){
+ term.setBold();
+ }
+
+ protected void enter_underline_mode(){
+ term.setUnderline();
+ }
+
+ protected void enter_reverse_mode(){
+ term.setReverse();
+ }
+
+ protected void change_scroll_region(int y1, int y2){
+ region_y1=y1;
+ region_y2=y2;
+ }
+
+ protected void cursor_address(int r, int c){
+ term.draw_cursor();
+ x=(c-1)*char_width;
+ y=r*char_height;
+ //System.out.println("setCourosr: "+x+" "+y);
+ term.setCursor(x, y);
+ term.draw_cursor();
+ }
+
+ protected void parm_down_cursor(int lines){
+ term.draw_cursor();
+ y+=(lines)*char_height;
+ term.setCursor(x, y);
+ term.draw_cursor();
+ }
+
+ protected void parm_left_cursor(int chars){
+ term.draw_cursor();
+ x-=(chars)*char_width;
+ term.setCursor(x, y);
+ term.draw_cursor();
+ }
+
+ protected void parm_right_cursor(int chars){
+ term.draw_cursor();
+ x+=(chars)*char_width;
+ term.setCursor(x, y);
+ term.draw_cursor();
+ }
+
+ protected void clr_eol(){
+ term.draw_cursor();
+ term.clear_area(x, y-char_height, term_width*char_width, y);
+ term.redraw(x, y-char_height, (term_width)*char_width-x, char_height);
+ term.draw_cursor();
+ }
+
+ protected void clr_bol(){
+ term.draw_cursor();
+ term.clear_area(0, y-char_height, x, y);
+ term.redraw(0, y-char_height, x, char_height);
+ term.draw_cursor();
+ }
+
+ protected void clr_eos(){
+ term.draw_cursor();
+ term.clear_area(x, y-char_height, term_width*char_width, term_height
+ *char_height);
+ term.redraw(x, y-char_height, term_width*char_width-x, term_height
+ *char_height-y+char_height);
+ term.draw_cursor();
+ }
+
+ protected void parm_up_cursor(int lines){
+ term.draw_cursor();
+ // x=0;
+ // y-=char_height;
+ y-=(lines)*char_height;
+ term.setCursor(x, y);
+ term.draw_cursor();
+ }
+
+ protected void bell(){
+ term.beep();
+ }
+
+ protected void tab(){
+ term.draw_cursor();
+ x=(((x/char_width)/tab+1)*tab*char_width);
+ if(x>=term_width*char_width){
+ x=0;
+ y+=char_height;
+ }
+ term.setCursor(x, y);
+ term.draw_cursor();
+ }
+
+ protected void carriage_return(){
+ term.draw_cursor();
+ x=0;
+ term.setCursor(x, y);
+ term.draw_cursor();
+ }
+
+ protected void cursor_left(){
+ term.draw_cursor();
+ x-=char_width;
+ if(x<0){
+ y-=char_height;
+ x=term_width*char_width-char_width;
+ }
+ term.setCursor(x, y);
+ term.draw_cursor();
+ }
+
+ protected void cursor_down(){
+ term.draw_cursor();
+ y+=char_height;
+ term.setCursor(x, y);
+ term.draw_cursor();
+
+ check_region();
+ }
+
+ private byte[] b2=new byte[2];
+ private byte[] b1=new byte[1];
+
+ protected void draw_text() throws java.io.IOException{
+
+ int rx;
+ int ry;
+ int w;
+ int h;
+
+ check_region();
+
+ rx=x;
+ ry=y;
+
+ byte b=getChar();
+ term.draw_cursor();
+ //System.out.print(new Character((char)b)+"["+Integer.toHexString(b&0xff)+"]");
+ if((b&0x80)!=0){
+ term.clear_area(x, y-char_height, x+char_width*2, y);
+ b2[0]=b;
+ b2[1]=getChar();
+ term.drawString(new String(b2, 0, 2, "EUC-JP"), x, y);
+ x+=char_width;
+ x+=char_width;
+ w=char_width*2;
+ h=char_height;
+ }
+ else{
+ pushChar(b);
+ int foo=getASCII(term_width-(x/char_width));
+ if(foo!=0){
+ //System.out.println("foo="+foo+" "+x+", "+(y-char_height)+" "+(x+foo*char_width)+" "+y+" "+buf+" "+bufs+" "+b+" "+buf[bufs-foo]);
+ //System.out.println("foo="+foo+" ["+new String(buf, bufs-foo, foo));
+ term.clear_area(x, y-char_height, x+foo*char_width, y);
+ term.drawBytes(buf, bufs-foo, foo, x, y);
+ }
+ else{
+ foo=1;
+ term.clear_area(x, y-char_height, x+foo*char_width, y);
+ b1[0]=getChar();
+ term.drawBytes(b1, 0, foo, x, y);
+ //System.out.print("["+Integer.toHexString(bar[0]&0xff)+"]");
+ }
+ x+=(char_width*foo);
+ w=char_width*foo;
+ h=char_height;
+ }
+ term.redraw(rx, ry-char_height, w, h);
+ term.setCursor(x, y);
+ term.draw_cursor();
+ }
+
+ private void check_region(){
+ if(x>=term_width*char_width){
+ //System.out.println("!! "+new Character((char)b)+"["+Integer.toHexString(b&0xff)+"]");
+ x=0;
+ y+=char_height;
+ //System.out.println("@1: ry="+ry);
+ }
+
+ if(y>region_y2*char_height){
+ while(y>region_y2*char_height){
+ y-=char_height;
+ }
+ term.draw_cursor();
+ term.scroll_area(0, region_y1*char_height, term_width*char_width,
+ (region_y2-region_y1)*char_height, 0, -char_height);
+ term.clear_area(0, y-char_height, term_width*char_width, y);
+ term.redraw(0, 0, term_width*char_width, region_y2*char_height);
+ term.setCursor(x, y);
+ term.draw_cursor();
+ }
+ }
+}
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;
+ }
+}
diff --git a/src/com/jcraft/jcterm/Term.java b/src/com/jcraft/jcterm/Term.java
new file mode 100644
index 0000000..c574509
--- /dev/null
+++ b/src/com/jcraft/jcterm/Term.java
@@ -0,0 +1,80 @@
+/* -*-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;
+import java.io.OutputStream;
+
+public interface Term{
+
+ void start(InputStream in, OutputStream out);
+
+ int getRowCount();
+
+ int getColumnCount();
+
+ int getCharWidth();
+
+ int getCharHeight();
+
+ void setCursor(int x, int y);
+
+ void clear();
+
+ void draw_cursor();
+
+ void redraw(int x, int y, int width, int height);
+
+ //void redraw();
+ void clear_area(int x1, int y1, int x2, int y2);
+
+ void scroll_area(int x, int y, int w, int h, int dx, int dy);
+
+ void drawBytes(byte[] buf, int s, int len, int x, int y);
+
+ void drawString(String str, int x, int y);
+
+ void beep();
+
+ void setDefaultForeGround(Object foreground);
+
+ void setDefaultBackGround(Object background);
+
+ void setForeGround(Object foreground);
+
+ void setBackGround(Object background);
+
+ void setBold();
+
+ void setUnderline();
+
+ void setReverse();
+
+ void resetAllAttributes();
+
+ int getTermWidth();
+
+ int getTermHeight();
+
+ Object getColor(int index);
+}