diff --git a/src/FileLoader.cc b/src/FileLoader.cc new file mode 100644 index 0000000..1083d57 --- /dev/null +++ b/src/FileLoader.cc @@ -0,0 +1,97 @@ +#include "FileLoader.h" +#include "FileReader.h" +#include +#include +#include +#include +#include + +/** Create a FileLoader. */ +FileLoader::FileLoader() +{ + m_buf = NULL; + m_line_endings = LINE_ENDING_LF; + m_lines = NULL; +} + +FileLoader::~FileLoader() +{ + if (m_buf != NULL) + { + delete[] m_buf; + m_buf = NULL; + } +} + +bool FileLoader::load(const char * fname) +{ + size_t size; + + if (!FileReader::load(fname, &m_buf, &size)) + { + return false; + } + + load_buf(size); + + return true; +} + +void FileLoader::load_buf(size_t size) +{ + LineIndexPairVectorRef lines[LINE_ENDING_COUNT]; + size_t line_start[LINE_ENDING_COUNT] = {0}; + unsigned int n_cr = 0; + unsigned int n_lf = 0; + bool crlf = true; + for (size_t i = 0; i < LINE_ENDING_COUNT; i++) + { + lines[i] = std::make_shared(); + } + for (size_t i = 0; i < size; i++) + { + if (m_buf[i] == '\r') + { + lines[LINE_ENDING_CR]->push_back(LineIndexPair(&m_buf[line_start[LINE_ENDING_CR]], i - line_start[LINE_ENDING_CR])); + n_cr++; + line_start[LINE_ENDING_CR] = i + 1; + if (crlf) + { + if ((i < (size - 1)) && (m_buf[i + 1] == '\n')) + { + lines[LINE_ENDING_CRLF]->push_back(LineIndexPair(&m_buf[line_start[LINE_ENDING_CRLF]], i - line_start[LINE_ENDING_CRLF])); + n_lf++; + i++; + line_start[LINE_ENDING_CRLF] = i + 1; + } + else + { + crlf = false; + } + } + } + else if (m_buf[i] == '\n') + { + lines[LINE_ENDING_LF]->push_back(LineIndexPair(&m_buf[line_start[LINE_ENDING_LF]], i - line_start[LINE_ENDING_LF])); + crlf = false; + n_lf++; + line_start[LINE_ENDING_LF] = i + 1; + } + } + + if (crlf && (n_lf > 0u)) + { + m_line_endings = LINE_ENDING_CRLF; + m_lines = lines[LINE_ENDING_CRLF]; + } + else if ((n_cr > 0u) && (n_lf == 0u)) + { + m_line_endings = LINE_ENDING_CR; + m_lines = lines[LINE_ENDING_CR]; + } + else + { + m_line_endings = LINE_ENDING_LF; + m_lines = lines[LINE_ENDING_LF]; + } +} diff --git a/src/FileLoader.h b/src/FileLoader.h new file mode 100644 index 0000000..8ca7dd8 --- /dev/null +++ b/src/FileLoader.h @@ -0,0 +1,44 @@ +#ifndef JES_FILELOADER_H +#define JES_FILELOADER_H + +#include +#include +#include + +class FileLoader +{ +public: + enum + { + LINE_ENDING_LF, + LINE_ENDING_CR, + LINE_ENDING_CRLF, + LINE_ENDING_COUNT + }; + + FileLoader(); + ~FileLoader(); + bool load(const char * fname); + unsigned int num_lines() + { + if (m_lines == NULL) + { + return 0u; + } + else + { + return m_lines->size(); + } + } + int get_line_endings() { return m_line_endings; } +protected: + typedef std::pair LineIndexPair; + typedef std::vector LineIndexPairVector; + typedef std::shared_ptr LineIndexPairVectorRef; + void load_buf(size_t size); + uint8_t * m_buf; + int m_line_endings; + LineIndexPairVectorRef m_lines; +}; + +#endif