#include "TextLoader.h" #include /** Create a TextLoader. */ TextLoader::TextLoader() { m_line_endings = LineEndings::LF; m_lines = NULL; m_eol_at_eof = true; } /** * Scan text to detect line endings and record their positions. * * @param buffer Buffer containing the text to import. * @param size Size of the buffer. */ void TextLoader::load_buffer(uint8_t * buffer, size_t size) { std::shared_ptr> lines[LineEndings::COUNT]; size_t line_start[LineEndings::COUNT] = {0}; unsigned int n_cr = 0; unsigned int n_lf = 0; bool crlf = true; for (size_t i = 0; i < LineEndings::COUNT; i++) { lines[i] = std::make_shared>(); } for (size_t i = 0; i < size; i++) { if (buffer[i] == '\r') { lines[LineEndings::CR]->push_back(Span(&buffer[line_start[LineEndings::CR]], i - line_start[LineEndings::CR])); n_cr++; line_start[LineEndings::CR] = i + 1; if (crlf) { if ((i < (size - 1)) && (buffer[i + 1] == '\n')) { lines[LineEndings::CRLF]->push_back(Span(&buffer[line_start[LineEndings::CRLF]], i - line_start[LineEndings::CRLF])); n_lf++; i++; line_start[LineEndings::CRLF] = i + 1; } else { crlf = false; } } } else if (buffer[i] == '\n') { lines[LineEndings::LF]->push_back(Span(&buffer[line_start[LineEndings::LF]], i - line_start[LineEndings::LF])); crlf = false; n_lf++; line_start[LineEndings::LF] = i + 1; } } if (crlf && (n_lf > 0u)) { m_line_endings = LineEndings::CRLF; } else if ((n_cr > 0u) && (n_lf == 0u)) { m_line_endings = LineEndings::CR; } else { m_line_endings = LineEndings::LF; } m_lines = lines[m_line_endings]; /* Check if there is a line that was not terminated by a EOL sequence at * the end of the file. */ if (line_start[m_line_endings] < size) { m_lines->push_back(Span(&buffer[line_start[m_line_endings]], size - line_start[m_line_endings])); m_eol_at_eof = false; } }