Blame view

readline/src/pad/prac1/EditableBufferedReader.java 4.46 KB
Imanol-Mikel Barba Sabariego authored
1
package pad.prac1;
Imanol-Mikel Barba Sabariego authored
2
3
4
import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
5
import java.util.Scanner;
Imanol-Mikel Barba Sabariego authored
6
7
8
9


public class EditableBufferedReader extends BufferedReader 
{
10
11
12
13
	/*
	 * MODE DEFINITIONS
	 */
14
15
16
17
	public static final int DEL_BACKWARD 	= 0;
	public static final int DEL_FORWARD 	= 1;
	public static final int INSERT 			= 0;
	public static final int OVERWRITE 		= 1;
18
19
20
21
22
23

	/*
	 * TYPE DEFINITIONS
	 */

	public static final int ESCAPE_SEQUENCE = 0;
24
25
	public static final int PRINTABLE 		= 1;
	public static final int NON_PRINTABLE 	= 2;
26
27

	/* KEY DEFINITIONS
28
	 * 
29
	 * ESC 			(0x1B) 					Starts an escape sequence
30
	 * ESC+[+C 		(0x1B 0x5B 0x43) 		Cursor Forward
31
	 * ESC+[+D 		(0x1B 0x5B 0x44) 		Cursor Backward
32
33
34
35
	 * ESC+[+2+~ 	(0x1B 0x5B 0x32 0x7E) 	Insert
	 * ESC+[+3+~ 	(0x1B 0x5B 0x33 0x7E) 	Delete forward
	 * ESC+O+H 		(0x1B 0x4F 0x48) 		Home
	 * ESC+O+F 		(0x1B 0x4F 0x46) 		End
36
37
38
39
	 */

	public static final int RETURN_KEY 		= 0x0D;
	public static final int BACKSPACE 		= 0x08;
40
	public static final int BACKSPACE_DEL 	= 0x7F;
41
42
	public static final int ESC 			= 0x1B;
	public static final int ESC_SEQ 		= 0x5B;
43
44
	public static final int UP				= 0x41;
	public static final int DOWN			= 0x42;
45
46
	public static final int FORWARD 		= 0x43;
	public static final int BACKWARD		= 0x44;
47
	public static final int GOTO			= 0x48;
48
	public static final int DEL 			= 0x33;
49
50
51
52
	public static final int TILDE 			= 0x7E;
	public static final int HOME_END 		= 0x4F;
	public static final int HOME 			= 0x48;
	public static final int END 			= 0x46;
53
54
55
	public static final int INSERT_KEY		= 0x32;
	public static final int INS_SPACE		= 0x40;
	public static final int DEL_CHAR		= 0x50;
56
57
	public static final int EOF				= 0x04;
	public static final int LINE_FEED		= 0x0A;
Imanol-Mikel Barba Sabariego authored
58
59
60
61
	private Console console 				= new Console();
	private Line line 						= new Line(console);
	private boolean endOfFile 				= false;
62
Imanol-Mikel Barba Sabariego authored
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
	public EditableBufferedReader(Reader in)
	{
		super(in);
	}

	public EditableBufferedReader(Reader in, int sz)
	{
		super(in,sz);
	}

	private void setRaw() throws IOException, InterruptedException
	{
		String[] cmd = {"/bin/sh", "-c", "stty raw -echo </dev/tty"};
		Runtime.getRuntime().exec(cmd).waitFor();
	}

	private void unsetRaw() throws IOException, InterruptedException
	{
		String[] cmd = {"/bin/sh", "-c", "stty -raw echo </dev/tty"};
		Runtime.getRuntime().exec(cmd).waitFor();
	}
85
	private void parseKey() throws IOException
86
	{
87
		Scanner scanner = new Scanner(System.in);
Imanol-Mikel Barba Sabariego authored
88
        if(scanner.findWithinHorizon("(\\033)?", 0).length() > 0)
89
		{
Imanol-Mikel Barba Sabariego authored
90
91
			scanner.skip("(\\033)?");
			if(scanner.findWithinHorizon("(\\[)?", 0).length() > 0)
92
			{
Imanol-Mikel Barba Sabariego authored
93
94
95
96
97
98
99
100
101
102
				scanner.skip("(\\[)?");
	    		int character = (int)scanner.findWithinHorizon("(?s).{1}", 0).charAt(0);
	        	switch(character)
	        	{
			        case FORWARD:
						line.setCursorTo(line.getCursorPosition()+1);
					break;

					case BACKWARD:
						line.setCursorTo(line.getCursorPosition()-1);
103
104
					break;
Imanol-Mikel Barba Sabariego authored
105
106
					case DEL:
						line.delChar(DEL_FORWARD);
107
					break;
Imanol-Mikel Barba Sabariego authored
108
109
110

					case INSERT_KEY:
						line.toggleMode();
111
					break;
Imanol-Mikel Barba Sabariego authored
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
	        	}
	        	return;
    		}
			else if(scanner.findWithinHorizon("O?", 0).length() > 0)
			{
				scanner.skip("O?");
        		int character = (int)scanner.findWithinHorizon("(?s).{1}", 0).charAt(0);
            	switch(character)
            	{
    	        	case HOME:
    					line.setCursorTo(1);
    				break;

    				case END:
    					line.setCursorTo(line.length()+1);
    				break;
            	}
            	return;
130
131
			}
		}
Imanol-Mikel Barba Sabariego authored
132
        else
133
        {
Imanol-Mikel Barba Sabariego authored
134
        	int character = (int)scanner.findWithinHorizon("(?s).{1}", 0).charAt(0);
135
        	switch(character)
Imanol-Mikel Barba Sabariego authored
136
137
138
139
	        {
				case BACKSPACE:
				case BACKSPACE_DEL:
					line.delChar(DEL_BACKWARD);
140
				break;
Imanol-Mikel Barba Sabariego authored
141
142
143
144
				case EOF:
					endOfFile = true;
				break;
145
146

				case RETURN_KEY:
Imanol-Mikel Barba Sabariego authored
147
148
				default:
					line.addChar((char)character);
149
				break;
Imanol-Mikel Barba Sabariego authored
150
151
	        }
	        return;
152
        }
153
154
	}
Imanol-Mikel Barba Sabariego authored
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
	public int read() throws IOException
	{
		return super.read();
	}

	public String readLine()
	{
		try 
		{
			setRaw();
		} 
		catch (Exception e) 
		{
			System.out.println("Couldn't set terminal in raw mode");
			return "";
		}
171
		try
Imanol-Mikel Barba Sabariego authored
172
		{
173
			while(!endOfFile)
Imanol-Mikel Barba Sabariego authored
174
			{
175
				parseKey();
Imanol-Mikel Barba Sabariego authored
176
177
			}
		}
178
179
		catch(Exception e)
		{
180
			e.printStackTrace();
181
182
183
			System.out.println("Error reading line");
			return "";
		}
Imanol-Mikel Barba Sabariego authored
184
185
186
187
188
189
190
191
192
		try 
		{
			unsetRaw();
		} 
		catch (Exception e) 
		{
			System.out.println("Couldn't unset raw mode");
			return "";
		}
193
		System.out.println("");
194
		return line.toString();
Imanol-Mikel Barba Sabariego authored
195
	}
196
}