//
// This software is now distributed according to
// the Lesser Gnu Public License. Please see
// http://www.gnu.org/copyleft/lesser.txt for
// the details.
// -- Happy Computing!
//
package com.stevesoft.ewe_pat.wrap;
import com.stevesoft.ewe_pat.*;
import ewe.io.*;
/** Provides a wrapper for a RandomAccessFile so that it
can be searched by Regex. */
public class RandomAccessFileWrap implements StringLike {
long offset = 0;
public void setOffset(long o) {
offset = o;
i0 = iend = 0;
}
public long getOffset() {
return offset;
}
RandomAccessFile raf;
int i0=0,iend=0;
byte[] buf = new byte[1024];
public int getBufferSize() {
return buf.length;
}
public void setBufferSize(int bs) {
buf = new byte[bs];
i0 = iend = 0;
}
public RandomAccessFileWrap(String file) throws IOException {
this.raf = new RandomAccessFile(file,"r");
}
public RandomAccessFileWrap(RandomAccessFile raf) {
this.raf = raf;
}
public char charAt(int i) {
if(i >= i0 && i < iend)
return (char)buf[i-i0];
try {
i0 = i-5;
//if(i0+offset<0) i0=(int)(-offset);
if(i0<0) i0=0;
raf.seek(i0+offset);
iend = i0+raf.read(buf,0,buf.length);
if(i >= i0 && i < iend)
return (char)buf[i-i0];
} catch(Throwable t) {}
throw new ArrayIndexOutOfBoundsException("Out of bounds for file:"+
" i="+i+
", Final Buffer: i0="+i0+
" iend="+iend);
}
public String toString() { throw new Error("Not implemented"); }
public int length() {
try {
long len = raf.length()-offset;
if(len > Integer.MAX_VALUE)
return Integer.MAX_VALUE;
return (int)len;
} catch(IOException ioe) {
return 0;
}
}
public String substring(int i1,int i2) {
StringBuffer sb = new StringBuffer();
for(int i=i1;i<i2;i++)
sb.append(charAt(i));
return sb.toString();
}
public Object unwrap() { return raf; }
public static void main(String[] files) throws IOException {
for(int i=0;i<files.length;i++) {
RandomAccessFileWrap fw =
new RandomAccessFileWrap(new RandomAccessFile(files[i],"r"));
Regex r = new Regex("toString\\(\\) *(?@{})");
r.setGFlag(true);
r.optimize();
ewe.sys.Vm.out().print(files[i]+" ");
int j=0;
do {
if(r.searchFrom(fw,j)) {
ewe.sys.Vm.out().println("Matched at index: "+
r.matchedFrom());
j=r.matchedTo();
} else
ewe.sys.Vm.out().println("not found");
ewe.sys.Vm.out().println(r.stringMatched());
} while(r.didMatch());
}
}
public BasicStringBufferLike newStringBufferLike() {
return new StringBufferWrap();
}
public int indexOf(char c) {
for(int i=0;i<length();i++)
if(charAt(i)==c)
return i;
return -1;
}
}