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