//===--- 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/Assertions.h" #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 &OutLines) { SmallVector 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(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()); }