SortedSet: Enable set comparision operations on views, and improve performance
[mono.git] / mcs / class / System / System.Text.RegularExpressions / replace.cs
index 7b8a56b279f5c4275fd1fa53bc44544574035fe9..835ea7ce0aa744186c6f607d269e460fc0410e37 100644 (file)
@@ -36,12 +36,14 @@ using Parser = System.Text.RegularExpressions.Syntax.Parser;
 namespace System.Text.RegularExpressions {
 
        class ReplacementEvaluator {
-               public static string Evaluate (string replacement, Match match) {
+               public static string Evaluate (string replacement, Match match)
+               {
                        ReplacementEvaluator ev = new ReplacementEvaluator (match.Regex, replacement);
                        return ev.Evaluate (match);
                }
 
-               public ReplacementEvaluator (Regex regex, string replacement) {
+               public ReplacementEvaluator (Regex regex, string replacement)
+               {
                        this.regex = regex;
                        this.replacement = replacement;
                        this.pieces = null;
@@ -51,6 +53,8 @@ namespace System.Text.RegularExpressions {
 
                public string Evaluate (Match match) 
                {
+                       if (n_pieces == 0)
+                               return replacement;
                        StringBuilder sb = new StringBuilder ();
                        EvaluateAppend (match, sb);
                        return sb.ToString ();
@@ -58,17 +62,16 @@ namespace System.Text.RegularExpressions {
 
                public void EvaluateAppend (Match match, StringBuilder sb)
                {
-                       int i = 0, k, count;
-
                        if (n_pieces == 0) {
                                sb.Append (replacement);
                                return;
                        }
 
+                       int i = 0;
                        while (i < n_pieces) {
-                               k = pieces [i++];
+                               int k = pieces [i++];
                                if (k >= 0) {
-                                       count = pieces [i++];
+                                       int count = pieces [i++];
                                        sb.Append (replacement, k, count);
                                } else if (k < -3) {
                                        Group group = match.Groups [-(k + 4)];
@@ -84,6 +87,15 @@ namespace System.Text.RegularExpressions {
                        }
                }
 
+               public bool NeedsGroupsOrCaptures {
+                       get {
+                               if (n_pieces == 0)
+                                       return false;
+                               else
+                                       return true;
+                       }
+               }
+
                void Ensure (int size)
                {
                        int new_size;
@@ -118,9 +130,8 @@ namespace System.Text.RegularExpressions {
                }
 
                // private
-               private void Compile () {
-                       replacement = Parser.Unescape (replacement);
-
+               private void Compile ()
+               {
                        int anchor = 0, ptr = 0, saveptr;
                        char c;
                        while (ptr < replacement.Length) {
@@ -162,7 +173,8 @@ namespace System.Text.RegularExpressions {
                                AddFromReplacement (anchor, ptr);
                }
 
-               private int CompileTerm (ref int ptr) {
+               private int CompileTerm (ref int ptr)
+               {
                        char c = replacement [ptr];
 
                        if (Char.IsDigit (c)) {         // numbered group