diff options
Diffstat (limited to 'euler/source/io')
-rw-r--r-- | euler/source/io/fclose.cpp | 10 | ||||
-rw-r--r-- | euler/source/io/fopen.cpp | 54 | ||||
-rw-r--r-- | euler/source/io/fread.cpp | 9 |
3 files changed, 73 insertions, 0 deletions
diff --git a/euler/source/io/fclose.cpp b/euler/source/io/fclose.cpp new file mode 100644 index 0000000..6f43f85 --- /dev/null +++ b/euler/source/io/fclose.cpp @@ -0,0 +1,10 @@ +#include <cstdio> + +namespace std { + + int fclose(FILE *stream) { + delete stream; + return 0; + } + +} diff --git a/euler/source/io/fopen.cpp b/euler/source/io/fopen.cpp new file mode 100644 index 0000000..8d47bf0 --- /dev/null +++ b/euler/source/io/fopen.cpp @@ -0,0 +1,54 @@ +#include <stdint.h> +#include <cstring> +#include <cstdio> + +namespace std { + + FILE *fopen(const char *filename, const char *mode) { + + bool read = false; + bool write = false; + bool append = false; + bool extended = false; + bool create = false; + + for (const char *p = mode; *p; ++p) + switch (*p) { + case 'r': + read = true; + continue; + case 'w': + write = true; + continue; + case 'a': + append = true; + continue; + case '+': + extended = true; + continue; + case 'x': + create = true; + continue; + default: + continue; + } + + __euler_stream_handle handle; + __euler_stream_result res = __euler_open_file( + filename, strlen(filename), handle, write || append, create); + + if (res != __EULER_SR_SUCCESS) + return 0; + + euler::file_stream *f = new euler::file_stream(handle, read || extended, + write || extended, write && !append, append); + + if (f->good) + return f; + + delete f; + return 0; + + } + +} diff --git a/euler/source/io/fread.cpp b/euler/source/io/fread.cpp new file mode 100644 index 0000000..e2d05b6 --- /dev/null +++ b/euler/source/io/fread.cpp @@ -0,0 +1,9 @@ +#include <cstdio> + +namespace std { + + size_t fread(void *buffer, size_t size, size_t count, FILE *stream) { + return stream->try_read(buffer, size * count) ? count : 0; + } + +} |