001: package gnu.mapping;
002:
003: import java.io.*;
004:
005: public class InPort extends gnu.text.LineBufferedReader implements
006: Printable {
007: public InPort(Reader in) {
008: super (in);
009: }
010:
011: public InPort(Reader in, String name) {
012: this (in);
013: setName(name);
014: }
015:
016: public InPort(InputStream in) {
017: super (in);
018: }
019:
020: public InPort(InputStream in, String name) {
021: this (in);
022: setName(name);
023: }
024:
025: public static Reader convertToReader(InputStream in, Object conv) {
026: if (conv != null && conv != Boolean.TRUE) {
027: String enc = (conv == Boolean.FALSE ? "8859_1" : conv
028: .toString());
029: try {
030: return new java.io.InputStreamReader(in, enc);
031: } catch (java.io.UnsupportedEncodingException ex) {
032: throw new RuntimeException(
033: "unknown character encoding: " + enc);
034: }
035: }
036: return new java.io.InputStreamReader(in);
037: }
038:
039: public InPort(InputStream in, String name, Object conv)
040: throws java.io.UnsupportedEncodingException {
041: this (convertToReader(in, conv), name);
042: if (conv == Boolean.FALSE) {
043: // Use a fixed-size buffer. This prevents really-long "lines"
044: // from causing the buffer to grow to accomodate them.
045: try {
046: setBuffer(new char[2048]);
047: } catch (java.io.IOException ex) { /* ignored */
048: }
049: } else
050: setConvertCR(true);
051: }
052:
053: private static InPort systemInPort = new TtyInPort(System.in,
054: "<stdin>", OutPort.outDefault());
055: private static InPort defaultInPort = systemInPort;
056:
057: static public InPort inDefault() {
058: Thread thread = Thread.currentThread();
059: if (thread instanceof Future)
060: return ((Future) thread).in;
061: else
062: return defaultInPort;
063: }
064:
065: static public void setInDefault(InPort in) {
066: Thread thread = Thread.currentThread();
067: if (thread instanceof Future)
068: ((Future) thread).in = in;
069: else
070: defaultInPort = in;
071: }
072:
073: public static InPort openFile(String fname)
074: throws java.io.UnsupportedEncodingException,
075: java.io.FileNotFoundException {
076: java.io.InputStream strm = new java.io.FileInputStream(fname);
077: strm = new java.io.BufferedInputStream(strm);
078: return openFile(strm, fname);
079: }
080:
081: public static InPort openFile(InputStream strm, String fname)
082: throws java.io.UnsupportedEncodingException {
083: return new InPort(strm, fname, Environment.user().get(
084: "port-char-encoding"));
085: }
086:
087: // FIXME - Having this be in InPort while ScmRead takes a LineBufferedReader
088: // is flakey. Maybe this should be some kind of "attribute".
089: public char readState = '\n';
090:
091: /** Return a character that indicates what we are currently reading.
092: * Returns '\n' if we are not inside read; '\"' if reading a string;
093: * '|' if inside a comment; '(' if inside a list; and
094: * ' ' if otherwise inside a read. */
095: public char getReadState() {
096: return readState;
097: }
098:
099: public void print(java.io.PrintWriter ps) {
100: ps.print("#<input-port");
101: String name = getName();
102: if (name != null) {
103: ps.print(' ');
104: ps.print(name);
105: }
106: ps.print('>');
107: }
108: }
|