16 #include "llvm/Support/SourceMgr.h"
17 #include "llvm/Support/raw_ostream.h"
24 raw_ostream &os, llvm::StringRef inputSplitMarker,
25 llvm::StringRef outputSplitMarker) {
27 if (inputSplitMarker.empty())
28 return processChunkBuffer(std::move(originalBuffer), os);
30 const int inputSplitMarkerLen = inputSplitMarker.size();
32 auto *origMemBuffer = originalBuffer.get();
34 const int checkLen = 2;
36 origMemBuffer->getBuffer().split(rawSourceBuffers,
37 inputSplitMarker.drop_back(checkLen));
38 if (rawSourceBuffers.empty())
42 llvm::SourceMgr fileSourceMgr;
43 fileSourceMgr.AddNewSourceBuffer(std::move(originalBuffer), SMLoc());
52 for (
auto buffer : rawSourceBuffers) {
60 buffer.starts_with(inputSplitMarker.take_back(checkLen)) &&
61 buffer.size() > checkLen && buffer[checkLen] !=
'0';
63 sourceBuffers.push_back(prev);
64 prev = buffer.drop_front(checkLen);
67 auto splitLoc = SMLoc::getFromPointer(buffer.data());
68 fileSourceMgr.PrintMessage(llvm::errs(), splitLoc,
69 llvm::SourceMgr::DK_Warning,
70 "near miss with file split marker");
71 prev = StringRef(prev.data(), prev.size() + inputSplitMarkerLen -
72 checkLen + buffer.size());
76 sourceBuffers.push_back(prev);
79 bool hadFailure =
false;
80 auto interleaveFn = [&](StringRef subBuffer) {
81 auto splitLoc = SMLoc::getFromPointer(subBuffer.data());
82 unsigned splitLine = fileSourceMgr.getLineAndColumn(splitLoc).first;
83 auto subMemBuffer = llvm::MemoryBuffer::getMemBufferCopy(
84 subBuffer, Twine(
"within split at ") +
85 origMemBuffer->getBufferIdentifier() +
":" +
86 Twine(splitLine) +
" offset ");
87 if (
failed(processChunkBuffer(std::move(subMemBuffer), os)))
90 llvm::interleave(sourceBuffers, os, interleaveFn,
91 (llvm::Twine(outputSplitMarker) +
"\n").str());
Include the generated interface declarations.
LogicalResult failure(bool isFailure=true)
Utility function to generate a LogicalResult.
LogicalResult success(bool isSuccess=true)
Utility function to generate a LogicalResult.
LogicalResult splitAndProcessBuffer(std::unique_ptr< llvm::MemoryBuffer > originalBuffer, ChunkBufferHandler processChunkBuffer, raw_ostream &os, llvm::StringRef inputSplitMarker=kDefaultSplitMarker, llvm::StringRef outputSplitMarker="")
Splits the specified buffer on a marker (// ----- by default), processes each chunk independently acc...
bool failed(LogicalResult result)
Utility function that returns true if the provided LogicalResult corresponds to a failure value.
This class represents an efficient way to signal success or failure.