7cb6ad3e8deb0169642d954866d440438550f29b
[jalviewjs.git] / unused / com / stevesoft / pat / RegexReader.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;\r
9 \r
10 import java.io.*;\r
11 \r
12 import com.stevesoft.pat.wrap.*;\r
13 \r
14 /**\r
15  * This class allows you to replace the text in strings as you read them in. Be\r
16  * careful what you do with this freedom... using Regex.perlCode("s{.*}{x}s") as\r
17  * your pattern will result in loading the entire contents of the Reader into\r
18  * memory.\r
19  */\r
20 public class RegexReader extends Reader\r
21 {\r
22   RBuffer rb = new RBuffer(new javajs.util.SB());\r
23 \r
24   PartialBuffer wrap = new PartialBuffer(rb.sb);\r
25 \r
26   boolean moreToRead = true;\r
27 \r
28   Reader r;\r
29 \r
30   Replacer rp;\r
31 \r
32   // the buffer size\r
33   int nmax = 2 * 1024;\r
34 \r
35   public RegexReader(Regex rex, Reader r)\r
36   {\r
37     this.r = r;\r
38     rp = rex.getReplacer();\r
39   }\r
40 \r
41   public RegexReader(Transformer tex, Reader r)\r
42   {\r
43     this.r = r;\r
44     rp = tex.getReplacer();\r
45   }\r
46 \r
47   public void reset() throws IOException\r
48   {\r
49     r.reset();\r
50     rb = new RBuffer(new javajs.util.SB());\r
51     wrap = new PartialBuffer(rb.sb);\r
52     moreToRead = true;\r
53   }\r
54 \r
55   void readData() throws IOException\r
56   {\r
57     int c;\r
58     int n = 0;\r
59     while ((c = r.read()) != -1)\r
60     {\r
61       rb.sb.appendC((char) c);\r
62       if (n++ > nmax)\r
63       {\r
64         break;\r
65       }\r
66     }\r
67     if (c == -1 && n == 0)\r
68     {\r
69       moreToRead = false;\r
70       wrap.allowOverRun = false;\r
71     }\r
72   }\r
73 \r
74   void getMoreData() throws IOException\r
75   {\r
76     while (rb.pos >= rb.epos)\r
77     {\r
78       wrap.overRun = false;\r
79       if (rb.next != null)\r
80       {\r
81         rb = rb.next;\r
82       }\r
83       else if (rb.done)\r
84       {\r
85         break;\r
86       }\r
87       else if (rb.epos >= rb.sb.length() && rb.epos > nmax)\r
88       {\r
89         rb.pos = 1;\r
90         rb.epos = 1;\r
91         rb.sb.setLength(1);\r
92         readData();\r
93       }\r
94       else if (rb.epos >= rb.sb.length() && moreToRead)\r
95       {\r
96         readData();\r
97       }\r
98       else if (rp.getRegex().matchAt(wrap, rb.epos))\r
99       {\r
100         if (wrap.overRun)\r
101         {\r
102           readData();\r
103         }\r
104         else\r
105         {\r
106           StringBufferWrap sbw = new StringBufferWrap();\r
107           StringBufferLike sbl = new StringBufferLike(sbw);\r
108           /*\r
109            * ReplaceRule rr = rex.getReplaceRule(); while(rr != null) {\r
110            * rr.apply(sbl,rex); rr = rr.next; }\r
111            */\r
112           Regex rex = rp.getRegex();\r
113           int npos = rex.matchedTo();\r
114           rp.setBuffer(sbl);\r
115           rp.setSource(wrap);\r
116           rp.setPos(npos);\r
117           rp.apply(rex, rex.getReplaceRule());\r
118           int opos = rb.epos;\r
119           RBuffer rb2 = new RBuffer((javajs.util.SB) sbw.unwrap());\r
120           rb2.epos = rb2.sb.length();\r
121           RBuffer rb3 = new RBuffer(rb.sb);\r
122 \r
123           rb.next = rb2;\r
124           rb2.next = rb3;\r
125 \r
126           if (npos == opos)\r
127           {\r
128             rb3.epos = npos + 1;\r
129             if (rb3.epos > rb3.sb.length())\r
130             {\r
131               if (rb.pos >= rb.epos)\r
132               {\r
133                 rb = rb.next;\r
134               }\r
135               rb3.pos = rb3.epos = 0;\r
136               rb3.done = true;\r
137               // break;\r
138             }\r
139             rb3.pos = npos;\r
140           }\r
141           else\r
142           {\r
143             rb3.pos = rb3.epos = npos;\r
144           }\r
145 \r
146         }\r
147       }\r
148       else\r
149       {\r
150         if (wrap.overRun)\r
151         {\r
152           readData();\r
153         }\r
154         else if (rb.epos < rb.sb.length())\r
155         {\r
156           rb.epos++;\r
157         }\r
158         else\r
159         {\r
160           break;\r
161         }\r
162       }\r
163     }\r
164   }\r
165 \r
166   public int read() throws IOException\r
167   {\r
168     if (rb.pos >= rb.epos)\r
169     {\r
170       getMoreData();\r
171       if (rb.pos >= rb.epos)\r
172       {\r
173         return -1;\r
174       }\r
175     }\r
176     // System.out.println(rb);\r
177     return rb.sb.charAt(rb.pos++);\r
178   }\r
179 \r
180   public int read(char[] buf, int off, int len) throws IOException\r
181   {\r
182     int c = -1;\r
183     int end = off + len;\r
184     for (int i = off; i < end; i++)\r
185     {\r
186       c = read();\r
187       if (c < 0)\r
188       {\r
189         if (i == off)\r
190         {\r
191           return -1;\r
192         }\r
193         return i - off;\r
194       }\r
195       buf[i] = (char) c;\r
196     }\r
197     return len;\r
198   }\r
199 \r
200   public void close() throws IOException\r
201   {\r
202     r.close();\r
203   }\r
204 \r
205   public boolean markSupported()\r
206   {\r
207     return false;\r
208   }\r
209 \r
210   /**\r
211    * Get the size of the working buffer. The current buffer may be larger if the\r
212    * pattern demands it.\r
213    */\r
214   public int getBufferSize()\r
215   {\r
216     return nmax;\r
217   }\r
218 \r
219   /**\r
220    * Set the size of the working buffer. The current buffer may be larger if the\r
221    * pattern demands it.\r
222    */\r
223   public void setBufferSize(int n)\r
224   {\r
225     nmax = n;\r
226   }\r
227 \r
228   int max_lines = 2;\r
229 \r
230   /**\r
231    * This function no longer serves any purpose.\r
232    * \r
233    * @deprecated\r
234    */\r
235   public int getMaxLines()\r
236   {\r
237     return max_lines;\r
238   }\r
239 \r
240   /**\r
241    * This function no longer serves any purpose.\r
242    * \r
243    * @deprecated\r
244    */\r
245   public void setMaxLines(int ml)\r
246   {\r
247     max_lines = ml;\r
248   }\r
249 \r
250   char EOLchar = '\n';\r
251 \r
252   /**\r
253    * This function no longer serves any purpose.\r
254    * \r
255    * @deprecated\r
256    */\r
257   public char getEOLchar()\r
258   {\r
259     return EOLchar;\r
260   }\r
261 \r
262   /**\r
263    * This function no longer serves any purpose.\r
264    * \r
265    * @deprecated\r
266    */\r
267   public void setEOLchar(char c)\r
268   {\r
269     EOLchar = c;\r
270   }\r
271 \r
272   public long skip(long d) throws IOException\r
273   {\r
274     // This is probably inefficient, I just did it\r
275     // this way to avoid possible bugs.\r
276     long n = 0;\r
277     while (n < d && read() != -1)\r
278     {\r
279       n++;\r
280     }\r
281     return n;\r
282   }\r
283 \r
284   /*\r
285    * static void test(String re,String inp,int n) throws Exception { Reader r =\r
286    * new StringReader(inp); r = new BufferedReader(r); Regex rex =\r
287    * Regex.perlCode(re); String res1 = rex.replaceAll(inp); int c = -1;\r
288    * javajs.util.SB sb = new javajs.util.SB(); RegexReader rr = new\r
289    * RegexReader(rex,r); rr.setBufferSize(n); while( (c = rr.read()) != -1)\r
290    * sb.append((char)c); String res2 = sb.toString(); if(!res1.equals(res2)) {\r
291    * System.out.println("nmax="+n); System.out.println("re="+re);\r
292    * System.out.println("inp="+inp); System.out.println("res1="+res1);\r
293    * System.out.println("res2="+res2); System.exit(255); } } public static void\r
294    * main(String[] args) throws Exception { for(int n=6;n<15;n++) {\r
295    * test("s/x/y/","-----x123456789",n); test("s/x/y/","x123456789",n);\r
296    * test("s/x/y/","-----x",n);\r
297    * test("s/x.*?x/y/",".xx..x..x...x...x....x....x",n);\r
298    * test("s/x.*x/[$&]/","--x........x--xx",n);\r
299    * test("s/x.*x/[$&]/","--x........x------",n);\r
300    * test("s/.$/a/m","bb\nbbb\nbbbb\nbbbbb\nbbbbbb\nbbbbbbbbbbbb",n);\r
301    * test("s/.$/a/","123",n);\r
302    * test("s/.$/a/","bb\nbbb\nbbbb\nbbbbb\nbbbbbb\nbb",n);\r
303    * test("s/^./a/","bb\nbbb\nbbbb\nbbbbb\nbbbbbb\nbb",n);\r
304    * test("s/$/a/","bbb",n); test("s/^/a/","bbb",n); test("s/^/a/","",n);\r
305    * test("s{.*}{N}","xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",n);\r
306    * test("s/.{0,7}/y/","AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",n);\r
307    * test("s/x/$&/","xxx",n); } System.out.println("Success!!!"); }\r
308    */\r
309 }\r