diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2020-01-25 12:31:29 +0100 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2020-01-25 12:49:23 +0100 |
| commit | b113d0825cf82f66f738746db0f21745017552e9 (patch) | |
| tree | 33f22ef776366d893a27803745dbdd7d5ae50222 /src/filemanager.cpp | |
| parent | 680d1eb93bfd0ffa274da2a28dc7fce704a059b9 (diff) | |
| download | PROJ-b113d0825cf82f66f738746db0f21745017552e9.tar.gz PROJ-b113d0825cf82f66f738746db0f21745017552e9.zip | |
Init file reading: use FileManager::open_resource_file() instead of deprecated proj_api I/O
Diffstat (limited to 'src/filemanager.cpp')
| -rw-r--r-- | src/filemanager.cpp | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/filemanager.cpp b/src/filemanager.cpp index 4218fde1..75476974 100644 --- a/src/filemanager.cpp +++ b/src/filemanager.cpp @@ -70,6 +70,62 @@ File::File(const std::string &name) : name_(name) {} File::~File() = default; +// --------------------------------------------------------------------------- + +std::string File::read_line(size_t maxLen, bool &maxLenReached, + bool &eofReached) { + constexpr size_t MAX_MAXLEN = 1024 * 1024; + maxLen = std::min(maxLen, MAX_MAXLEN); + while (true) { + // Consume existing lines in buffer + size_t pos = readLineBuffer_.find_first_of("\r\n"); + if (pos != std::string::npos) { + if (pos > maxLen) { + std::string ret(readLineBuffer_.substr(0, maxLen)); + readLineBuffer_ = readLineBuffer_.substr(maxLen); + maxLenReached = true; + eofReached = false; + return ret; + } + std::string ret(readLineBuffer_.substr(0, pos)); + if (readLineBuffer_[pos] == '\r' && + readLineBuffer_[pos + 1] == '\n') { + pos += 1; + } + readLineBuffer_ = readLineBuffer_.substr(pos + 1); + maxLenReached = false; + eofReached = false; + return ret; + } + + const size_t prevSize = readLineBuffer_.size(); + if (maxLen <= prevSize) { + std::string ret(readLineBuffer_.substr(0, maxLen)); + readLineBuffer_ = readLineBuffer_.substr(maxLen); + maxLenReached = true; + eofReached = false; + return ret; + } + + if (eofReadLine_) { + std::string ret = readLineBuffer_; + readLineBuffer_.clear(); + maxLenReached = false; + eofReached = ret.empty(); + return ret; + } + + readLineBuffer_.resize(maxLen); + const size_t nRead = + read(&readLineBuffer_[prevSize], maxLen - prevSize); + if (nRead < maxLen - prevSize) + eofReadLine_ = true; + readLineBuffer_.resize(prevSize + nRead); + } +} + +// --------------------------------------------------------------------------- + #ifdef _WIN32 /* The bulk of utf8towc()/utf8fromwc() is derived from the utf.c module from |
