Files
Sourcetrail/src/lib/utility/text/TextAccess.cpp
T

176 lines
3.5 KiB
C++

#include "TextAccess.h"
#include <fstream>
#include "utility/logging/logging.h"
std::shared_ptr<TextAccess> TextAccess::createFromFile(const FilePath& filePath)
{
std::shared_ptr<TextAccess> result(new TextAccess());
result->m_filePath = filePath;
result->m_lines = readFile(filePath);
return result;
}
std::shared_ptr<TextAccess> TextAccess::createFromString(const std::string& text, const FilePath& filePath)
{
std::shared_ptr<TextAccess> result(new TextAccess());
result->m_lines = splitStringByLines(text);
result->m_filePath = filePath;
return result;
}
TextAccess::~TextAccess()
{
}
unsigned int TextAccess::getLineCount() const
{
return m_lines.size();
}
FilePath TextAccess::getFilePath() const
{
return m_filePath;
}
std::string TextAccess::getLine(const unsigned int lineNumber) const
{
if (!checkIndexInRange(lineNumber))
{
return "";
}
return m_lines[lineNumber - 1]; // -1 to correct for use as index
}
std::vector<std::string> TextAccess::getLines(const unsigned int firstLineNumber, const unsigned int lastLineNumber)
{
if (!checkIndexIntervalInRange(firstLineNumber, lastLineNumber))
{
return std::vector<std::string>();
}
std::vector<std::string>::iterator first = m_lines.begin() + firstLineNumber - 1; // -1 to correct for use as index
std::vector<std::string>::iterator last = m_lines.begin() + lastLineNumber;
return std::vector<std::string>(first, last);
}
const std::vector<std::string>& TextAccess::getAllLines() const
{
return m_lines;
}
std::string TextAccess::getText() const
{
std::string result = "";
for (unsigned int i = 0; i < m_lines.size(); i++)
{
result += m_lines[i];
}
return result;
}
std::vector<std::string> TextAccess::readFile(const FilePath& filePath)
{
std::vector<std::string> result;
std::ifstream srcFile;
srcFile.open(filePath.str());
if (srcFile.fail())
{
LOG_ERROR(L"Could not open file " + filePath.wstr());
return result;
}
while (!srcFile.eof())
{
std::string line;
std::getline(srcFile, line);
result.push_back(line + '\n');
}
srcFile.close();
if (!result.empty())
{
std::string last = result.back().substr(0, result.back().size() - 1);
result.pop_back();
if (!last.empty())
{
result.push_back(last);
}
}
return result;
}
std::vector<std::string> TextAccess::splitStringByLines(const std::string& text)
{
std::vector<std::string> result;
size_t prevIndex = 0;
size_t index = text.find('\n');
while (index != std::string::npos)
{
result.push_back(text.substr(prevIndex, index - prevIndex) + '\n');
prevIndex = index + 1;
index = text.find('\n', prevIndex);
}
if (prevIndex < text.length())
{
result.push_back(text.substr(prevIndex));
}
return result;
}
TextAccess::TextAccess()
: m_filePath(L"")
{
}
bool TextAccess::checkIndexInRange(const unsigned int index) const
{
if (index < 1)
{
LOG_WARNING_STREAM(<< "Line numbers start with one, is " << index);
return false;
}
else if (index > m_lines.size())
{
LOG_WARNING_STREAM(<< "Tried to access index " << index << ". Maximum index is " << m_lines.size());
return false;
}
return true;
}
bool TextAccess::checkIndexIntervalInRange(
const unsigned int firstIndex,
const unsigned int lastIndex
) const
{
if (!checkIndexInRange(firstIndex) || !checkIndexInRange(lastIndex))
{
return false;
}
else if (firstIndex > lastIndex)
{
LOG_WARNING_STREAM(
<< "Index 'firstLine' has to be lower or equal index 'lastLine', is " << firstIndex << " > " << lastIndex
);
return false;
}
return true;
}