| //===--- PrimitiveParsing.cpp - Primitive parsing routines ----------------===// |
| // |
| // This source file is part of the Swift.org open source project |
| // |
| // Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors |
| // Licensed under Apache License v2.0 with Runtime Library Exception |
| // |
| // See https://swift.org/LICENSE.txt for license information |
| // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors |
| // |
| //===----------------------------------------------------------------------===// |
| /// |
| /// \file |
| /// Primitive parsing routines useful in various places in the compiler. |
| /// |
| //===----------------------------------------------------------------------===// |
| |
| #include "swift/Basic/PrimitiveParsing.h" |
| #include "llvm/ADT/SmallVector.h" |
| |
| using namespace llvm; |
| |
| unsigned swift::measureNewline(const char *BufferPtr, const char *BufferEnd) { |
| if (BufferPtr == BufferEnd) |
| return 0; |
| |
| if (*BufferPtr == '\n') |
| return 1; |
| |
| assert(*BufferPtr == '\r'); |
| unsigned Bytes = 1; |
| if (BufferPtr != BufferEnd && *BufferPtr == '\n') |
| Bytes++; |
| return Bytes; |
| } |
| |
| void |
| swift::trimLeadingWhitespaceFromLines(StringRef RawText, |
| unsigned WhitespaceToTrim, |
| SmallVectorImpl<StringRef> &OutLines) { |
| SmallVector<StringRef, 8> Lines; |
| |
| bool IsFirstLine = true; |
| |
| while (!RawText.empty()) { |
| size_t Pos = RawText.find_first_of("\n\r"); |
| if (Pos == StringRef::npos) |
| Pos = RawText.size(); |
| |
| StringRef Line = RawText.substr(0, Pos); |
| Lines.push_back(Line); |
| if (!IsFirstLine) { |
| size_t NonWhitespacePos = RawText.find_first_not_of(' '); |
| if (NonWhitespacePos != StringRef::npos) |
| WhitespaceToTrim = |
| std::min(WhitespaceToTrim, |
| static_cast<unsigned>(NonWhitespacePos)); |
| } |
| IsFirstLine = false; |
| |
| RawText = RawText.drop_front(Pos); |
| unsigned NewlineBytes = measureNewline(RawText); |
| RawText = RawText.drop_front(NewlineBytes); |
| } |
| |
| IsFirstLine = true; |
| for (auto &Line : Lines) { |
| if (!IsFirstLine) { |
| Line = Line.drop_front(WhitespaceToTrim); |
| } |
| IsFirstLine = false; |
| } |
| |
| OutLines.append(Lines.begin(), Lines.end()); |
| } |