package xtc.lang.blink;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import xtc.lang.blink.Event.UserCommandEvent;
import xtc.lang.blink.Event.BlinkEventSource;
/** A user commandline interface. */
class CommandLineInterface extends Thread implements BlinkEventSource {
/** The Blink debugger. */
private final Blink dbg;
/** The user terminal input stream. */
private final BufferedReader userInput = new BufferedReader(
new InputStreamReader(System.in));
/** The user terminal output stream. */
private final BufferedOutputStream userOutput =
new BufferedOutputStream(System.out);
/** The user terminal error stream. */
private final BufferedOutputStream userError =
new BufferedOutputStream(System.err);
/**
* The constructor.
* @param dbg The Blink debugger.
*/
CommandLineInterface(Blink dbg) {
this.dbg = dbg;
}
/** Getter method for the string representation. */
public String getEventSourceName() {
return "DebuggerUser";
}
/** Monitor user input, and enqueue a user message event. */
public void run() {
if (dbg.options.getVerboseLevel() >= 1 ) {
dbg.out("beginning user input line read thread.\n");
}
while (true) {
String line;
try {
line = userInput.readLine();
if (line == null) {
// EOF --> implicit "exit" user command.
dbg.enqueEvent(new UserCommandEvent(this, "exit"));
break;
}
} catch (IOException e) {
dbg.err("I'm terminating this session "
+ "since I failed in getting your command.\n");
break;
}
dbg.enqueEvent(new UserCommandEvent(this, line));
}
if (dbg.options.getVerboseLevel() >= 1 ) {
dbg.out("finishing user input line read thread.\n");
}
}
/**
* Print a message to the console.
*
* @param msg The message to print.
*/
void out(String msg) {
byte[] bytes = msg.getBytes();
out(userOutput, bytes, 0, bytes.length);
}
/**
* Print an error message to the console.
*
* @param msg The error message to print.
*/
void err(String msg) {
byte[] bytes = msg.getBytes();
out(userError, bytes, 0, bytes.length);
}
/**
* Print a message to the stream.
*
* @param b The byte buffer.
* @param off The offset.
* @param len The length.
*/
private static synchronized void out(BufferedOutputStream out, byte[] b, int off, int len ) {
try {
out.write(b, off, len);
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}