package com.elharo.io;
import java.io.*;
public class SourceReader extends FilterReader {
public SourceReader(Reader in) {
super(in);
}
private int buffer = -1;
public int read() throws IOException {
if (this.buffer != -1) {
int c = this.buffer;
this.buffer = -1;
return c;
}
int c = in.read();
if (c != '\\') return c;
int next = in.read();
if (next != 'u' ) { // This is not a Unicode escape
this.buffer = next;
return c;
}
// Read next 4 hex digits
// If the next four chars do not make a valid hex digit
// this is not a valid .java file.
StringBuffer sb = new StringBuffer();
sb.append((char) in.read());
sb.append((char) in.read());
sb.append((char) in.read());
sb.append((char) in.read());
String hex = sb.toString();
try {
return Integer.valueOf(hex, 16).intValue();
}
catch (NumberFormatException ex) {
throw new IOException("Bad Unicode escape: \\u" + hex);
}
}
private boolean endOfStream = false;
public int read(char[] text, int offset, int length) throws IOException {
if (endOfStream) return -1;
int numRead = 0;
for (int i = offset; i < offset+length; i++) {
int temp = this.read();
if (temp == -1) {
this.endOfStream = true;
break;
}
text[i] = (char) temp;
numRead++;
}
return numRead;
}
public long skip(long n) throws IOException {
char[] c = new char[(int) n];
int numSkipped = this.read(c);
return numSkipped;
}
}
|