java/ch/wlkl/wsh/ExtFD.java
package ch.wlkl.wsh;
class ExtFD<T> extends Cat<T> {
String ext = null;
String extOpt = null;
Cat<T> in = null;
Cat<T> out = null;
char state = 'e';
public ExtFD () {
}
/**
* return a new Cat as the concatenation of args, using {@link #reset(Object[])}
*/
public ExtFD (Object... args) {
this();
reset(args);
}
public void reset (Object... args) {
close();
ext = extOpt = null;
in = out = null;
state = 'e';
writeAll(args);
}
@SuppressWarnings("unchecked")
public void writeAll(Object... args) {
String opt = " ";
String o1 = " ";
for (Object obj : args) {
if (null != (o1 = Option.single(obj))) {
opt = normalizeOpt(' ', o1).replace(eContinue, ' ');
} else if (state == 'e') {
if (opt.charAt(0) != eExtFD)
fail("first opt not ext " + opt);
extOpt = opt;
ext = (String) obj;
} else if (opt.charAt(0) == 'r' || (opt.charAt(0) == ' ' && state == 'R')) {
if (state == 'R')
((Cat<String>)in).writeAll(opt, makeRead(opt, obj));
else if (in == null)
in = new Cat(opt, obj);
else
fail("bad < > change");
state = 'R';
} else if ("wa".indexOf(opt.charAt(0)) >= 0 || (opt.charAt(0) == ' ' && state == 'W')) {
if (state == 'W')
((Cat<String>)out).writeAll(opt, makeRead(opt, obj));
else if (out == null)
out = new Cat(opt, obj);
else
fail("bad < > change");
state = 'W';
} else {
fail("bad opt " + opt);
}
}
}
public void open(String opt) {
close();
state = 'o';
if (in != null) {
say("copying in to " + extOpt + " " + ext);
}
}
public void close() {
if (state == 'o' && out != null) {
say("copying " + extOpt + " " + ext + " to out " + out);
}
state = ' ';
say("copying in to " + extOpt + " " + ext);
}
public void write(T line) {
fail("write to ExtFD");
}
public T read() {
fail("read ExtFD");
return null;
}
}