/// <summary> /// Append text. /// </summary> public void Append(TextSpan textSpan, TextWriter writer) { // Skip empty spans if (textSpan.IsEmpty) { return; } var index = textSpan.BeginIndex; while (index < textSpan.EndIndex) { if (currentLineEmpty) { writer.Write(indentation); Column += indentation.Length; currentLineEmpty = false; } var lineBreakIndex = textSpan.OriginalText.IndexOf(index, textSpan.EndIndex, ch => ch == '\n'); if (lineBreakIndex == -1) { // No line break found writer.Write(index, textSpan.EndIndex, textSpan.OriginalText); index += (textSpan.EndIndex - index); } else { // Line break found ++lineBreakIndex; writer.Write(index, lineBreakIndex, textSpan.OriginalText); index += (lineBreakIndex - index); ++Line; currentLineEmpty = true; Column = 1; } } }
public List<AsbtractCodeFragment> Parse(FileLine line, IMessageHandler messageHandler) { List<AsbtractCodeFragment> fragments = new List<AsbtractCodeFragment>(); while (true) { var index = (line.BeginIndexNonSpace + 1); // Skip # // Find 'pragma' string preproDirective; index = this.MatchNextToken(line.Text, index, line.EndIndex, out preproDirective); if (index == -1) { break; } if (string.Compare(preproDirective, "pragma") != 0) { break; } // Find 'include' string pragmaName; index = this.MatchNextToken(line.Text, index, line.EndIndex, out pragmaName); if (index == -1) { break; } if (string.Compare(pragmaName, "include") != 0) { break; } // Find '"<Filename>"' var pragmaArgIndex = line.Text.IndexOf(index, line.EndIndex, ch => ch == '"'); if (pragmaArgIndex == -1) { break; } index = (pragmaArgIndex + 1); var pragmaArgEndIndex = BraceCounter.FindQuoteEnd(index, line.EndIndex, line.Text); if (pragmaArgEndIndex == -1) { break; } index = (pragmaArgEndIndex + 1); string pragmaArgument = line.Text.Substring(pragmaArgIndex + 1, (pragmaArgEndIndex - pragmaArgIndex - 1)); var textSpan = new TextSpan(line.BeginIndex, line.EndIndex, line.Text); fragments.Add(new OriginPragma(pragmaName, pragmaArgument, line, textSpan)); break; } fragments.Add(new OriginScript(line, new TextSpan(line.BeginIndex, line.EndIndex, line.Text))); return fragments; }