15 #include "llvm/Support/SourceMgr.h"
16 #include "llvm/Support/raw_ostream.h"
25 raw_ostream &os, llvm::StringRef inputSplitMarker,
26 llvm::StringRef outputSplitMarker) {
27 llvm::MemoryBufferRef originalBufferRef = originalBuffer->getMemBufferRef();
29 if (inputSplitMarker.empty())
30 return processChunkBuffer(std::move(originalBuffer), originalBufferRef, os);
32 const int inputSplitMarkerLen = inputSplitMarker.size();
35 const int checkLen = 2;
37 originalBufferRef.getBuffer().split(rawSourceBuffers,
38 inputSplitMarker.drop_back(checkLen));
39 if (rawSourceBuffers.empty())
43 llvm::SourceMgr fileSourceMgr;
44 fileSourceMgr.AddNewSourceBuffer(std::move(originalBuffer), SMLoc());
53 for (
auto buffer : rawSourceBuffers) {
61 buffer.starts_with(inputSplitMarker.take_back(checkLen)) &&
62 buffer.size() > checkLen && buffer[checkLen] !=
'0';
64 sourceBuffers.push_back(prev);
65 prev = buffer.drop_front(checkLen);
68 auto splitLoc = SMLoc::getFromPointer(buffer.data());
69 fileSourceMgr.PrintMessage(llvm::errs(), splitLoc,
70 llvm::SourceMgr::DK_Warning,
71 "near miss with file split marker");
72 prev = StringRef(prev.data(), prev.size() + inputSplitMarkerLen -
73 checkLen + buffer.size());
77 sourceBuffers.push_back(prev);
80 bool hadFailure =
false;
81 auto interleaveFn = [&](StringRef subBuffer) {
82 auto splitLoc = SMLoc::getFromPointer(subBuffer.data());
83 unsigned splitLine = fileSourceMgr.getLineAndColumn(splitLoc).first;
84 std::string name((Twine(
"within split at ") +
85 originalBufferRef.getBufferIdentifier() +
":" +
86 Twine(splitLine) +
" offset ")
91 llvm::MemoryBuffer::getMemBuffer(llvm::MemoryBufferRef(subBuffer, name),
94 processChunkBuffer(std::move(subMemBuffer), originalBufferRef, os)))
97 llvm::interleave(sourceBuffers, os, interleaveFn,
98 (llvm::Twine(outputSplitMarker) +
"\n").str());
101 return failure(hadFailure);
107 raw_ostream &os, llvm::StringRef inputSplitMarker,
108 llvm::StringRef outputSplitMarker) {
109 auto process = [&](std::unique_ptr<llvm::MemoryBuffer> chunkBuffer,
110 const llvm::MemoryBufferRef &, raw_ostream &os) {
111 return processChunkBuffer(std::move(chunkBuffer), os);
114 inputSplitMarker, outputSplitMarker);
Include the generated interface declarations.
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...