summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2024-04-22 12:51:55 +0200
committerRémi Verschelde <rverschelde@gmail.com>2024-04-22 12:51:55 +0200
commit504d01b61eaa3e0d1af0a4cea866c18ecfc1395c (patch)
tree20086da672e04f63a91c945581b062ff20e97939 /drivers
parent0b89b8b64c60b7fb7e9f1c26bf20b2c7d7c0adac (diff)
parent88b3e68f93fad5681b27b11ddacc562b03d5ef45 (diff)
downloadredot-engine-504d01b61eaa3e0d1af0a4cea866c18ecfc1395c.tar.gz
Merge pull request #90403 from bruvzg/file_resize
[FileAccess] Implement `resize` method.
Diffstat (limited to 'drivers')
-rw-r--r--drivers/unix/file_access_unix.cpp17
-rw-r--r--drivers/unix/file_access_unix.h1
-rw-r--r--drivers/unix/file_access_unix_pipe.h1
-rw-r--r--drivers/windows/file_access_windows.cpp19
-rw-r--r--drivers/windows/file_access_windows.h1
-rw-r--r--drivers/windows/file_access_windows_pipe.h1
6 files changed, 40 insertions, 0 deletions
diff --git a/drivers/unix/file_access_unix.cpp b/drivers/unix/file_access_unix.cpp
index a35d8bfdde..210507c2c6 100644
--- a/drivers/unix/file_access_unix.cpp
+++ b/drivers/unix/file_access_unix.cpp
@@ -286,6 +286,23 @@ Error FileAccessUnix::get_error() const {
return last_error;
}
+Error FileAccessUnix::resize(int64_t p_length) {
+ ERR_FAIL_NULL_V_MSG(f, FAILED, "File must be opened before use.");
+ int res = ::ftruncate(fileno(f), p_length);
+ switch (res) {
+ case 0:
+ return OK;
+ case EBADF:
+ return ERR_FILE_CANT_OPEN;
+ case EFBIG:
+ return ERR_OUT_OF_MEMORY;
+ case EINVAL:
+ return ERR_INVALID_PARAMETER;
+ default:
+ return FAILED;
+ }
+}
+
void FileAccessUnix::flush() {
ERR_FAIL_NULL_MSG(f, "File must be opened before use.");
fflush(f);
diff --git a/drivers/unix/file_access_unix.h b/drivers/unix/file_access_unix.h
index 553fbcf355..c0286dbff3 100644
--- a/drivers/unix/file_access_unix.h
+++ b/drivers/unix/file_access_unix.h
@@ -75,6 +75,7 @@ public:
virtual Error get_error() const override; ///< get last error
+ virtual Error resize(int64_t p_length) override;
virtual void flush() override;
virtual void store_8(uint8_t p_dest) override; ///< store a byte
virtual void store_16(uint16_t p_dest) override;
diff --git a/drivers/unix/file_access_unix_pipe.h b/drivers/unix/file_access_unix_pipe.h
index d14f897d8f..8e7988791b 100644
--- a/drivers/unix/file_access_unix_pipe.h
+++ b/drivers/unix/file_access_unix_pipe.h
@@ -70,6 +70,7 @@ public:
virtual Error get_error() const override; ///< get last error
+ virtual Error resize(int64_t p_length) override { return ERR_UNAVAILABLE; }
virtual void flush() override {}
virtual void store_8(uint8_t p_src) override; ///< store a byte
virtual void store_buffer(const uint8_t *p_src, uint64_t p_length) override; ///< store an array of bytes
diff --git a/drivers/windows/file_access_windows.cpp b/drivers/windows/file_access_windows.cpp
index dd8bceb573..726e0fdc5a 100644
--- a/drivers/windows/file_access_windows.cpp
+++ b/drivers/windows/file_access_windows.cpp
@@ -41,6 +41,7 @@
#include <windows.h>
#include <errno.h>
+#include <io.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <tchar.h>
@@ -369,6 +370,24 @@ Error FileAccessWindows::get_error() const {
return last_error;
}
+Error FileAccessWindows::resize(int64_t p_length) {
+ ERR_FAIL_NULL_V_MSG(f, FAILED, "File must be opened before use.");
+ errno_t res = _chsize_s(_fileno(f), p_length);
+ switch (res) {
+ case 0:
+ return OK;
+ case EACCES:
+ case EBADF:
+ return ERR_FILE_CANT_OPEN;
+ case ENOSPC:
+ return ERR_OUT_OF_MEMORY;
+ case EINVAL:
+ return ERR_INVALID_PARAMETER;
+ default:
+ return FAILED;
+ }
+}
+
void FileAccessWindows::flush() {
ERR_FAIL_NULL(f);
diff --git a/drivers/windows/file_access_windows.h b/drivers/windows/file_access_windows.h
index 173423fb06..a25bbcfb3a 100644
--- a/drivers/windows/file_access_windows.h
+++ b/drivers/windows/file_access_windows.h
@@ -77,6 +77,7 @@ public:
virtual Error get_error() const override; ///< get last error
+ virtual Error resize(int64_t p_length) override;
virtual void flush() override;
virtual void store_8(uint8_t p_dest) override; ///< store a byte
virtual void store_16(uint16_t p_dest) override;
diff --git a/drivers/windows/file_access_windows_pipe.h b/drivers/windows/file_access_windows_pipe.h
index e6abe61fa3..b885ef78e6 100644
--- a/drivers/windows/file_access_windows_pipe.h
+++ b/drivers/windows/file_access_windows_pipe.h
@@ -69,6 +69,7 @@ public:
virtual Error get_error() const override; ///< get last error
+ virtual Error resize(int64_t p_length) override { return ERR_UNAVAILABLE; }
virtual void flush() override {}
virtual void store_8(uint8_t p_src) override; ///< store a byte
virtual void store_buffer(const uint8_t *p_src, uint64_t p_length) override; ///< store an array of bytes