private static Boolean MatchesDirective( String trimmed, String directive, Int32 expectedParameters, out List <String> parameters, out Exception ex) { if (trimmed.StartsWith(directive, StringComparison.Ordinal) && (trimmed.Length == directive.Length || Char.IsWhiteSpace(trimmed[directive.Length]))) { parameters = new List <String>(); var startIndex = directive.Length; var inString = false; var parens = 0; for (var i = startIndex; i < trimmed.Length; i++) { var c = trimmed[i]; if (Char.IsWhiteSpace(c) && !inString && parens == 0) { if (startIndex < i) { parameters.Add(trimmed.Substring(startIndex, i - startIndex)); } startIndex = i + 1; } else if (c == '\'') { inString = !inString; } else if (c == '(' && !inString) { parens++; } else if (c == ')' && !inString) { parens--; } } if (startIndex < trimmed.Length) { parameters.Add(trimmed.Substring(startIndex)); } if (expectedParameters != parameters.Count) { ex = new ArgumentException(TemplateStrings.ExpectedNParametersFollowingDirective(expectedParameters, directive, parameters.Count)); parameters = null; return(false); } ex = null; return(true); } ex = null; parameters = null; return(false); }