b514846765810c39fbb6b6571019010096e4ac74
[jpf-core.git] / src / peers / gov / nasa / jpf / vm / JPF_java_util_regex_Matcher.java
1 /*
2  * Copyright (C) 2014, United States Government, as represented by the
3  * Administrator of the National Aeronautics and Space Administration.
4  * All rights reserved.
5  *
6  * The Java Pathfinder core (jpf-core) platform is licensed under the
7  * Apache License, Version 2.0 (the "License"); you may not use this file except
8  * in compliance with the License. You may obtain a copy of the License at
9  * 
10  *        http://www.apache.org/licenses/LICENSE-2.0. 
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and 
16  * limitations under the License.
17  */
18
19 package gov.nasa.jpf.vm;
20
21 import gov.nasa.jpf.Config;
22 import gov.nasa.jpf.annotation.MJI;
23 import gov.nasa.jpf.vm.MJIEnv;
24 import gov.nasa.jpf.vm.NativePeer;
25
26 import java.util.HashMap;
27 import java.util.regex.Matcher;
28 import java.util.regex.Pattern;
29
30 /**
31  * native peer for a regex Matcher
32  * this is just a delegatee peer
33  */
34 public class JPF_java_util_regex_Matcher extends NativePeer {
35
36   HashMap<Integer, Matcher> matchers;
37  
38   public JPF_java_util_regex_Matcher (Config conf) {
39     matchers = new HashMap<Integer,Matcher>();
40   }
41
42   void putInstance (MJIEnv env, int objref, Matcher matcher) {
43     int id = env.getIntField(objref,  "id");
44     matchers.put(id, matcher);
45   }
46
47   Matcher getInstance (MJIEnv env, int objref) {
48     
49     int id = env.getIntField(objref,  "id");
50     return matchers.get(id);
51   }
52   
53   @MJI
54   public void register____V (MJIEnv env, int objref) {
55     int patRef = env.getReferenceField(objref, "pattern");
56     
57     int regexRef = env.getReferenceField(patRef, "regex");
58     String regex = env.getStringObject(regexRef);
59     int flags = env.getIntField(patRef, "flags");
60     
61     Pattern pat = Pattern.compile(regex, flags);
62
63     int inputRef = env.getReferenceField(objref, "input");
64     String input = env.getStringObject(inputRef);
65     
66     Matcher matcher = pat.matcher(input);
67     putInstance(env, objref, matcher);
68   }
69   
70   @MJI
71   public boolean matches____Z (MJIEnv env, int objref) {
72     Matcher matcher = getInstance( env, objref);
73     return matcher.matches();
74   }
75   
76   @MJI
77   public boolean find____Z (MJIEnv env, int objref) {
78         Matcher matcher = getInstance( env, objref);
79     return matcher.find();
80   }
81
82   @MJI
83   public boolean lookingAt____Z(MJIEnv env, int objref) {
84     Matcher matcher = getInstance(env, objref);
85     return matcher.lookingAt();
86   }
87
88   @MJI
89   public int start__I__I(MJIEnv env, int objref, int group) {
90     Matcher matcher = getInstance(env, objref);
91     return matcher.start(group);
92   }
93
94   @MJI
95   public int end__I__I(MJIEnv env, int objref, int group) {
96     Matcher matcher = getInstance(env, objref);
97     return matcher.end(group);
98   }
99
100   @MJI
101   public int regionStart____I(MJIEnv env, int objref) {
102     Matcher matcher = getInstance(env, objref);
103     return matcher.regionStart();
104   }
105
106   @MJI
107   public int regionEnd____I(MJIEnv env, int objref) {
108     Matcher matcher = getInstance(env, objref);
109     return matcher.regionEnd();
110   }
111
112   @MJI
113   public int region__II__Ljava_util_regex_Matcher_2(MJIEnv env, int objref, int start, int end) {
114     Matcher matcher = getInstance(env, objref);
115     matcher = matcher.region(start, end);
116     putInstance(env, objref, matcher);
117
118     return objref;
119   }
120
121   @MJI
122   public int reset____Ljava_util_regex_Matcher_2 (MJIEnv env, int objref) {
123     Matcher matcher = getInstance( env, objref);
124
125     int inputRef = env.getReferenceField(objref, "input");
126     String input = env.getStringObject(inputRef);
127     
128     matcher = matcher.reset(input);
129     putInstance(env, objref, matcher);
130     
131     return objref;
132   }
133   
134   @MJI
135   public int groupCount____I (MJIEnv env, int objref) {
136     Matcher matcher = getInstance(env, objref);
137     return matcher.groupCount();
138   }
139   
140   @MJI
141   public int group__I__Ljava_lang_String_2 (MJIEnv env, int objref, int i) {
142     Matcher matcher = getInstance( env, objref);
143     String grp = matcher.group(i);
144     
145     return env.newString(grp);
146   }
147
148   @MJI
149   public int quoteReplacement__Ljava_lang_String_2__Ljava_lang_String_2 (MJIEnv env, int clsObjref, int string) {
150     String parm = env.getStringObject(string);
151     String result = Matcher.quoteReplacement(parm);
152     return env.newString(result);
153   }
154
155   @MJI
156   public int replaceAll__Ljava_lang_String_2__Ljava_lang_String_2 (MJIEnv env, int objref, int string) {
157     Matcher matcher = getInstance(env, objref);
158     String replacement = env.getStringObject(string);
159     String result = matcher.replaceAll(replacement);
160
161     int resultref = env.newString(result);
162     return resultref;
163   }
164   
165   @MJI
166   public int replaceFirst__Ljava_lang_String_2__Ljava_lang_String_2(MJIEnv env, int objref, int string) {
167     Matcher matcher = getInstance(env, objref);
168     String replacement = env.getStringObject(string);
169     String result = matcher.replaceFirst(replacement);
170
171     int resultref = env.newString(result);
172     return resultref;
173   }
174
175   @MJI
176   public boolean hasTransparentBounds____Z(MJIEnv env, int objref) {
177     Matcher matcher = getInstance(env, objref);
178     return matcher.hasTransparentBounds();
179   }
180
181   @MJI
182   public int useTransparentBounds__Z__Ljava_util_regex_Matcher_2(MJIEnv env, int objref, boolean b) {
183     Matcher matcher = getInstance(env, objref);
184     matcher = matcher.useTransparentBounds(b);
185     putInstance(env, objref, matcher);
186      
187     return objref;
188   }
189
190   @MJI
191   public boolean hasAnchoringBounds____Z(MJIEnv env, int objref) {
192     Matcher matcher = getInstance(env, objref);
193     return matcher.hasTransparentBounds();
194   }
195
196   @MJI
197   public int useAnchoringBounds__Z__Ljava_util_regex_Matcher_2(MJIEnv env, int objref, boolean b) {
198     Matcher matcher = getInstance(env, objref);
199     matcher = matcher.useAnchoringBounds(b);
200     putInstance(env, objref, matcher);
201
202     return objref;
203   }
204
205   @MJI
206   public int toString____Ljava_lang_String_2 (MJIEnv env, int objref) {
207     Matcher matcher = getInstance(env, objref);
208     String str = matcher.toString();
209
210     return env.newString(str);
211   }
212
213   @MJI
214   public boolean hitEnd____Z (MJIEnv env, int objref) {
215     Matcher matcher = getInstance( env, objref);
216     return matcher.hitEnd();
217   }
218
219   @MJI
220   public boolean requireEnd____Z (MJIEnv env, int objref) {
221     Matcher matcher = getInstance( env, objref);
222     return matcher.requireEnd();
223   }
224 }