needed for applet search
[jalview.git] / src / com / stevesoft / pat / wrap / RandomAccessFileWrap.java
1 //\r
2 // This software is now distributed according to\r
3 // the Lesser Gnu Public License.  Please see\r
4 // http://www.gnu.org/copyleft/lesser.txt for\r
5 // the details.\r
6 //    -- Happy Computing!\r
7 //\r
8 package com.stevesoft.pat.wrap;\r
9 \r
10 import com.stevesoft.pat.*;\r
11 import java.io.*;\r
12 \r
13 /** Provides a wrapper for a RandomAccessFile so that it\r
14     can be searched by Regex. */\r
15 public class RandomAccessFileWrap implements StringLike {\r
16 \r
17     long offset = 0;\r
18     public void setOffset(long o) {\r
19       offset = o;\r
20       i0 = iend = 0;\r
21     }\r
22     public long getOffset() {\r
23       return offset;\r
24     }\r
25     RandomAccessFile raf;\r
26     int i0=0,iend=0;\r
27     byte[] buf = new byte[1024];\r
28 \r
29     public int getBufferSize() {\r
30       return buf.length;\r
31     }\r
32 \r
33     public void setBufferSize(int bs) {\r
34       buf = new byte[bs];\r
35       i0 = iend = 0;\r
36     }\r
37 \r
38     public RandomAccessFileWrap(String file) throws IOException {\r
39         this.raf = new RandomAccessFile(file,"r");\r
40     }\r
41     public RandomAccessFileWrap(RandomAccessFile raf) {\r
42         this.raf = raf;\r
43     }\r
44 \r
45     public char charAt(int i) {\r
46         if(i >= i0 && i < iend)\r
47             return (char)buf[i-i0];\r
48 \r
49         try {\r
50             i0 = i-5;\r
51             //if(i0+offset<0) i0=(int)(-offset);\r
52             if(i0<0) i0=0;\r
53             raf.seek(i0+offset);\r
54             iend = i0+raf.read(buf,0,buf.length);\r
55 \r
56             if(i >= i0 && i < iend)\r
57                 return (char)buf[i-i0];\r
58         } catch(Throwable t) {}\r
59 \r
60         throw new ArrayIndexOutOfBoundsException("Out of bounds for file:"+\r
61           " i="+i+\r
62           ", Final Buffer: i0="+i0+\r
63           " iend="+iend);\r
64     }\r
65 \r
66     public String toString() { throw new Error("Not implemented"); }\r
67     public int length() {\r
68       try {\r
69         long len = raf.length()-offset;\r
70         if(len > Integer.MAX_VALUE)\r
71           return Integer.MAX_VALUE;\r
72         return (int)len;\r
73       } catch(IOException ioe) {\r
74         return 0;\r
75       }\r
76     }\r
77     public String substring(int i1,int i2) {\r
78         StringBuffer sb = new StringBuffer();\r
79         for(int i=i1;i<i2;i++)\r
80             sb.append(charAt(i));\r
81         return sb.toString();\r
82     }\r
83     public Object unwrap() { return raf; }\r
84 \r
85     public static void main(String[] files) throws IOException {\r
86       for(int i=0;i<files.length;i++) {\r
87         RandomAccessFileWrap fw =\r
88           new RandomAccessFileWrap(new RandomAccessFile(files[i],"r"));\r
89         Regex r = new Regex("toString\\(\\) *(?@{})");\r
90         r.setGFlag(true);\r
91         r.optimize();\r
92         System.out.print(files[i]+" ");\r
93         int j=0;\r
94         do {\r
95           if(r.searchFrom(fw,j)) {\r
96             System.out.println("Matched at index: "+\r
97              r.matchedFrom());\r
98             j=r.matchedTo();\r
99           } else\r
100             System.out.println("not found");\r
101           System.out.println(r.stringMatched());\r
102         } while(r.didMatch());\r
103       }\r
104     }\r
105 \r
106     public BasicStringBufferLike newStringBufferLike() {\r
107       return new StringBufferWrap();\r
108     }\r
109 \r
110     public int indexOf(char c) {\r
111       for(int i=0;i<length();i++)\r
112         if(charAt(i)==c)\r
113           return i;\r
114       return -1;\r
115     }\r
116 }\r