2 // PatternGrouping.jvm.cs
5 // Arina Itkes <arinai@mainsoft.com>
7 // Copyright (C) 2007 Mainsoft, Inc.
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34 using System.Collections.Generic;
36 using System.Collections;
38 namespace System.Text.RegularExpressions
40 sealed class PatternGrouping
43 IDictionary _groupNameToNumberMap;
44 int [] _javaToNetGroupNumbersMap;
45 string [] _groupNumberToNameMap;
46 int [] _netToJavaNumbersMap;
49 internal string [] GroupNumberToNameMap {
50 get { return _groupNumberToNameMap; }
53 internal int [] JavaToNetGroupNumbersMap {
54 get { return _javaToNetGroupNumbersMap; }
57 internal IDictionary GroupNameToNumberMap {
58 get { return _groupNameToNumberMap; }
61 internal int [] NetToJavaNumbersMap {
62 get { return _netToJavaNumbersMap; }
65 internal bool SameGroupsFlag {
66 get { return _sameGroupsFlag; }
69 internal int GroupCount {
70 get { return _groupCount; }
73 internal PatternGrouping () {
74 this._groupCount = -1;
77 internal void SetGroups (int netGroupCount, int javaGroupCount) {
78 this._groupCount = netGroupCount;
80 _groupNameToNumberMap = new Hashtable (_groupCount + 1);
81 _javaToNetGroupNumbersMap = new int [javaGroupCount + 1];
82 _groupNumberToNameMap = new string [_groupCount + 1];
83 _netToJavaNumbersMap = new int [_groupCount + 1];
85 for (int i = 0; i <= _groupCount; ++i) {
86 _groupNameToNumberMap.Add (i.ToString (), i);
87 _javaToNetGroupNumbersMap [i] = i;
88 _groupNumberToNameMap [i] = i.ToString ();
89 _netToJavaNumbersMap [i] = i;
91 for (int i = _groupCount + 1; i <= javaGroupCount; ++i) {
92 _javaToNetGroupNumbersMap [i] = -1;
96 internal void SetGroups (string [] namedGroups,
97 int [] javaGroupNumberToNetGroupNumber,
98 int noNamedGroupNumber,
99 int capturedGroupsCount,
100 int sameGroupsCounter,
101 RegexOptions options) {
102 _groupNumberToNameMap = new string [capturedGroupsCount + 1];
103 _groupNameToNumberMap = new Hashtable (capturedGroupsCount + 1);
104 _netToJavaNumbersMap = new int [capturedGroupsCount + 1];
106 _javaToNetGroupNumbersMap = javaGroupNumberToNetGroupNumber;
108 if ((options & RegexOptions.ExplicitCapture) == RegexOptions.ExplicitCapture) {
109 FillExplicitGroupMaps (namedGroups,
116 FillImplicitGroupMaps (namedGroups,
117 noNamedGroupNumber + 1,
125 private void FillImplicitGroupMaps (string [] namedGroups,
126 int namedGroupNumber,
127 int capturedGroupsCount,
128 int sameGroupsCounter,
129 RegexOptions options) {
130 int addedNamedGroupsCount = 0;
132 for (int i = 0; i < capturedGroupsCount + 1; ++i) {
133 int netGroupNumber = _javaToNetGroupNumbersMap [i];
134 if (netGroupNumber == -1) {
135 if (_groupNameToNumberMap.Contains (namedGroups [addedNamedGroupsCount])) {
136 _javaToNetGroupNumbersMap [i] = (int) _groupNameToNumberMap [namedGroups [addedNamedGroupsCount]];
140 _javaToNetGroupNumbersMap [i] = namedGroupNumber;
141 _groupNumberToNameMap [namedGroupNumber] = namedGroups [addedNamedGroupsCount];
145 netGroupNumber = _javaToNetGroupNumbersMap [i];
146 ++addedNamedGroupsCount;
149 _groupNumberToNameMap [netGroupNumber] =
150 netGroupNumber.ToString ();
152 _groupNameToNumberMap [_groupNumberToNameMap [netGroupNumber]] = netGroupNumber;
153 _netToJavaNumbersMap [_javaToNetGroupNumbersMap [i]] = i;
155 _groupCount = capturedGroupsCount - sameGroupsCounter;
156 _sameGroupsFlag = (sameGroupsCounter != 0);
160 private void FillExplicitGroupMaps (string [] namedGroups,
161 int capturedGroupsCount,
162 int sameGroupsCounter,
163 RegexOptions options) {
164 int addedNamedGroupsCount = 0;
165 int namedGroupNumber = 1;
166 int nonCapturedGroupsNumber = 0;
168 for (int i = 1; i < capturedGroupsCount + 1; ++i) {
169 int netGroupNumber = _javaToNetGroupNumbersMap [i];
170 if (netGroupNumber >= 0) {
171 _javaToNetGroupNumbersMap [i] = -1;
172 ++nonCapturedGroupsNumber;
176 if (_groupNameToNumberMap.Contains (namedGroups [addedNamedGroupsCount])) {
177 _javaToNetGroupNumbersMap [i] = (int) _groupNameToNumberMap [namedGroups [addedNamedGroupsCount]];
181 _javaToNetGroupNumbersMap [i] = namedGroupNumber;
182 _groupNumberToNameMap [namedGroupNumber] = namedGroups [addedNamedGroupsCount];
186 netGroupNumber = _javaToNetGroupNumbersMap [i];
187 ++addedNamedGroupsCount;
189 _groupNameToNumberMap [_groupNumberToNameMap [netGroupNumber]] = netGroupNumber;
190 _netToJavaNumbersMap [_javaToNetGroupNumbersMap [i]] = i;
192 _groupCount = capturedGroupsCount - sameGroupsCounter - nonCapturedGroupsNumber;
193 _sameGroupsFlag = (sameGroupsCounter != 0);