The Labs \ Source Viewer \ SSCLI \ Microsoft.JScript \ ReplaceWithString

  1. // ==++==
  2. //
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. //
  14. // ==--==
  15. namespace Microsoft.JScript
  16. {
  17.    
  18.     using System;
  19.     using System.Text.RegularExpressions;
  20.    
  21.     internal abstract class RegExpReplace
  22.     {
  23.         internal Match lastMatch;
  24.        
  25.         internal RegExpReplace()
  26.         {
  27.             this.lastMatch = null;
  28.         }
  29.        
  30.         internal abstract string Evaluate(Match match);
  31.     }
  32.    
  33.     internal class ReplaceUsingFunction : RegExpReplace
  34.     {
  35.         private ScriptFunction function;
  36.         private int cArgs;
  37.         private int[] groupNumbers;
  38.         private string source;
  39.        
  40.         internal ReplaceUsingFunction(Regex regex, ScriptFunction function, string source)
  41.         {
  42.             this.function = function;
  43.             this.cArgs = function.GetNumberOfFormalParameters();
  44.             bool hasArgumentsObject = (function is Closure) && ((Closure)function).func.hasArgumentsObject;
  45.             this.groupNumbers = null;
  46.             this.source = source;
  47.             if (this.cArgs > 1 || hasArgumentsObject) {
  48.                 string[] groupNames = regex.GetGroupNames();
  49.                 int cGroupNumbers = groupNames.Length - 1;
  50.                 if (hasArgumentsObject)
  51.                     this.cArgs = cGroupNumbers + 3;
  52.                 if (cGroupNumbers > 0) {
  53.                     if (cGroupNumbers > this.cArgs - 1)
  54.                         cGroupNumbers = this.cArgs - 1;
  55.                     this.groupNumbers = new int[cGroupNumbers];
  56.                     for (int i = 0; i < cGroupNumbers; i++)
  57.                         this.groupNumbers[i] = regex.GroupNumberFromName(groupNames[i + 1]);
  58.                 }
  59.             }
  60.         }
  61.        
  62.         internal override string Evaluate(Match match)
  63.         {
  64.             this.lastMatch = match;
  65.             object[] args = new object[this.cArgs];
  66.             if (this.cArgs > 0) {
  67.                 args[0] = match.ToString();
  68.                 if (this.cArgs > 1) {
  69.                     int i = 1;
  70.                     if (this.groupNumbers != null)
  71.                         for (; i <= this.groupNumbers.Length; i++) {
  72.                             Group group = match.Groups[this.groupNumbers[i - 1]];
  73.                             args[i] = group.Success ? group.ToString() : null;
  74.                         }
  75.                     if (i < this.cArgs) {
  76.                         args[i++] = match.Index;
  77.                         if (i < this.cArgs) {
  78.                             args[i++] = this.source;
  79.                             for (; i < this.cArgs; i++)
  80.                                 args[i] = null;
  81.                         }
  82.                     }
  83.                 }
  84.             }
  85.             object result = this.function.Call(args, null);
  86.             return match.Result(result is Empty ? "" : Convert.ToString(result));
  87.         }
  88.     }
  89.    
  90.     internal class ReplaceWithString : RegExpReplace
  91.     {
  92.         private string replaceString;
  93.        
  94.         internal ReplaceWithString(string replaceString)
  95.         {
  96.             this.replaceString = replaceString;
  97.         }
  98.        
  99.         internal override string Evaluate(Match match)
  100.         {
  101.             this.lastMatch = match;
  102.             return match.Result(replaceString);
  103.         }
  104.     }
  105. }

Developer Fusion