Adding .cvsignores
[mono.git] / mcs / class / System / System.Text.RegularExpressions / match.cs
1 //\r
2 // assembly:    System\r
3 // namespace:   System.Text.RegularExpressions\r
4 // file:        match.cs\r
5 //\r
6 // author:      Dan Lewis (dlewis@gmx.co.uk)\r
7 //              (c) 2002\r
8 \r
9 using System;\r
10 \r
11 namespace System.Text.RegularExpressions {\r
12 \r
13         [Serializable]\r
14         public class Capture {\r
15                 public int Index {\r
16                         get { return index; }\r
17                 }\r
18 \r
19                 public int Length {\r
20                         get { return length; }\r
21                 }\r
22 \r
23                 public string Value {\r
24                         get { return text.Substring (index, length); }\r
25                 }\r
26 \r
27                 public override string ToString () {\r
28                         return Value;\r
29                 }\r
30 \r
31                 // internal members\r
32 \r
33                 internal Capture (string text) : this (text, 0, 0) { }\r
34 \r
35                 internal Capture (string text, int index, int length) {\r
36                         this.text = text;\r
37                         this.index = index;\r
38                         this.length = length;\r
39                 }\r
40                 \r
41                 internal string Text {\r
42                         get { return text; }\r
43                 }\r
44 \r
45                 // private\r
46 \r
47                 internal int index, length;\r
48                 internal string text;\r
49         }\r
50 \r
51         [Serializable]\r
52         public class Group : Capture {\r
53                 public static Group Synchronized (Group inner) {\r
54                         return inner;   // is this enough?\r
55                 }\r
56 \r
57                 public CaptureCollection Captures {\r
58                         get { return captures; }\r
59                 }\r
60 \r
61                 public bool Success {\r
62                         get { return success; }\r
63                 }\r
64 \r
65                 // internal\r
66 \r
67                 internal Group (string text, int[] caps) : base (text) {\r
68                         this.captures = new CaptureCollection ();\r
69 \r
70                         if (caps == null || caps.Length == 0) {\r
71                                 this.success = false;\r
72                                 return;\r
73                         }\r
74 \r
75                         this.success = true;\r
76                         this.index = caps[0];\r
77                         this.length = caps[1];\r
78                         captures.Add (this);\r
79                         for (int i = 2; i < caps.Length; i += 2)\r
80                                 captures.Add (new Capture (text, caps[i], caps[i + 1]));\r
81                         captures.Reverse ();\r
82                 }\r
83 \r
84                 private bool success;\r
85                 private CaptureCollection captures;\r
86         }\r
87 \r
88         [Serializable]\r
89         public class Match : Group {\r
90                 public static Match Empty {\r
91                         get { return empty; }\r
92                 }\r
93                 \r
94                 public static Match Synchronized (Match inner) {\r
95                         return inner;   // FIXME need to sync on machine access\r
96                 }\r
97                 \r
98                 public virtual GroupCollection Groups {\r
99                         get { return groups; }\r
100                 }\r
101 \r
102                 public Match NextMatch () {\r
103                         if (this == Empty)\r
104                                 return Empty;\r
105 \r
106                         int scan_ptr = regex.RightToLeft ? Index : Index + Length;\r
107 \r
108                         // next match after an empty match: make sure scan ptr makes progress\r
109                         \r
110                         if (Length == 0)\r
111                                 scan_ptr += regex.RightToLeft ? -1 : +1;\r
112 \r
113                         return machine.Scan (regex, Text, scan_ptr, text_length);\r
114                 }\r
115 \r
116                 public virtual string Result (string replacement) {\r
117                         return ReplacementEvaluator.Evaluate (replacement, this);\r
118                 }\r
119 \r
120                 // internal\r
121 \r
122                 internal Match () : base (null, null) {\r
123                         this.regex = null;\r
124                         this.machine = null;\r
125                         this.text_length = 0;\r
126                         this.groups = new GroupCollection ();\r
127 \r
128                         groups.Add (this);\r
129                 }\r
130                 \r
131                 internal Match (Regex regex, IMachine machine, string text, int text_length, int[][] grps) :\r
132                         base (text, grps[0])\r
133                 {\r
134                         this.regex = regex;\r
135                         this.machine = machine;\r
136                         this.text_length = text_length;\r
137 \r
138                         this.groups = new GroupCollection ();\r
139                         groups.Add (this);\r
140                         for (int i = 1; i < grps.Length; ++ i)\r
141                                 groups.Add (new Group (text, grps[i]));\r
142                 }\r
143 \r
144                 internal Regex Regex {\r
145                         get { return regex; }\r
146                 }\r
147 \r
148                 // private\r
149 \r
150                 private Regex regex;\r
151                 private IMachine machine;\r
152                 private int text_length;\r
153                 private GroupCollection groups;\r
154 \r
155                 private static Match empty = new Match ();\r
156         }\r
157 }\r