aboutsummaryrefslogtreecommitdiff
path: root/src/filemanager.cpp
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2020-01-25 12:31:29 +0100
committerEven Rouault <even.rouault@spatialys.com>2020-01-25 12:49:23 +0100
commitb113d0825cf82f66f738746db0f21745017552e9 (patch)
tree33f22ef776366d893a27803745dbdd7d5ae50222 /src/filemanager.cpp
parent680d1eb93bfd0ffa274da2a28dc7fce704a059b9 (diff)
downloadPROJ-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.cpp56
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