/*
* CommandReader.java
*
* Created on 25. Oktober 2003, 03:03
*/
package org.gudy.azureus2.ui.console;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
import java.util.Vector;
/**
*
* @author tobi
*/
public class CommandReader extends Reader {
private final int ENTER = 0;
private final int TAB = 1;
private final int QUOTE = 3;
private final int ESCAPE = 4;
private final int NONQUOTEDESCAPE = 5;
private Reader in;
/** Creates a new instance of CommandReader */
public CommandReader(Reader _in) {
super();
in = _in;
}
private void ensureOpen() throws java.io.IOException {
if (in == null)
throw new IOException("Stream closed");
}
public void close() throws java.io.IOException {
synchronized(lock) {
if (in != null) {
in.close();
in = null;
}
}
}
public int read() throws java.io.IOException {
synchronized(lock) {
ensureOpen();
return in.read();
}
}
public int read(char[] cbuf, int off, int len) throws java.io.IOException {
synchronized(lock) {
ensureOpen();
return in.read(cbuf, off, len);
}
}
public String readLine() throws java.io.IOException {
synchronized(lock) {
ensureOpen();
StringBuffer line = new StringBuffer();
int ch;
while( (char)(ch = in.read()) != '\n' )
{
if( ch == -1 )
{
throw new IOException("stream closed");
}
line.append((char)ch);
}
return line.toString().trim();
}
}
public List parseCommandLine( String commandLine )
{
StringBuffer current = new StringBuffer();
Vector args = new Vector();
boolean allowEmpty = false;
boolean bailout = commandLine.length() == 0;
int index = 0;
int state = ENTER;
while (!bailout) {
int ch = commandLine.charAt(index++);
bailout = (index == commandLine.length());
char c = (char) ch;
// if (c!='\n'){
//
// line.append( c );
// }
//
switch (state) {
/*case SKIP:
switch (c) {
case ' ': case '\t':
break;
case '\"':
mode = QUOTE;
break;
case '&':
background = true;
case ';':
contLine = line.substring(pos +1);
pos = line.length();
break;
default:
mode = READ;
--pos;
}
break;*/
case ENTER:
switch (c) {
case '\"':
state = QUOTE;
break;
/*case ' ': case '\t':
mode = SKIP;
break;*/
case '\\':
state = NONQUOTEDESCAPE;
break;
// case '\n':
// bailout = true;
// break;
case '\r':
break;
default:
current.append(c);
}
if ((state == ENTER) && ((c==' ') || (bailout))) {
String arg = current.toString().trim();
if( arg.length() > 0 || allowEmpty )
{
args.addElement(arg);
allowEmpty = false;
}
current = new StringBuffer();
}
break;
case QUOTE:
switch (c) {
case '\"':
allowEmpty = true;
state = ENTER;
break;
case '\\':
state = ESCAPE;
break;
default:
current.append(c);
}
break;
case ESCAPE:
switch (c) {
case 'n': c = '\n'; break;
case 'r': c = '\r'; break;
case 't': c = '\t'; break;
case 'b': c = '\b'; break;
case 'f': c = '\f'; break;
default: current.append('\\'); break;
}
state = QUOTE;
current.append(c);
break;
case NONQUOTEDESCAPE:
switch (c) {
case ';':
state = ENTER;
current.append(c);
break;
default: // This is not a escaped char.
state = ENTER;
current.append('\\');
current.append(c);
break;
}
break;
}
}
if ((state == ENTER) && (current.toString().trim().length() > 0 || allowEmpty) )
{
String arg = current.toString().trim();
args.addElement(arg);
}
return args;
}
}
|