use 64bit file offsets and _ftelli64/_fseeki64 on Windows + specialize some FileStream methods

master
Daniel Kolesa 2015-07-01 20:59:05 +01:00
parent 1de58ac2b6
commit c86d31e5c2
2 changed files with 26 additions and 1 deletions

View File

@ -8,6 +8,7 @@
#include <stdio.h>
#include "octa/platform.hh"
#include "octa/string.hh"
#include "octa/stream.hh"
#include "octa/format.hh"
@ -86,11 +87,19 @@ struct FileStream: Stream {
}
bool seek(StreamOffset pos, StreamSeek whence = StreamSeek::set) {
#ifndef OCTA_PLATFORM_WIN32
return fseeko(p_f, pos, int(whence)) >= 0;
#else
return _fseeki64(p_f, pos, int(whence)) >= 0;
#endif
}
StreamOffset tell() const {
#ifndef OCTA_PLATFORM_WIN32
return ftello(p_f);
#else
return _ftelli64(p_f);
#endif
}
bool flush() { return !fflush(p_f); }
@ -103,6 +112,18 @@ struct FileStream: Stream {
return fwrite(buf, 1, count, p_f);
}
int getchar() {
return fgetc(p_f);
}
bool putchar(int c) {
return fputc(c, p_f) != EOF;
}
bool write(const char *s) {
return fputs(s, p_f) != EOF;
}
void swap(FileStream &s) {
octa::swap(p_f, s.p_f);
octa::swap(p_owned, s.p_owned);

View File

@ -8,6 +8,7 @@
#include <sys/types.h>
#include "octa/platform.hh"
#include "octa/types.hh"
#include "octa/range.hh"
#include "octa/type_traits.hh"
@ -17,8 +18,11 @@
namespace octa {
/* off_t is POSIX - will also work on windows with mingw/clang, but FIXME */
#ifndef OCTA_PLATFORM_WIN32
using StreamOffset = off_t;
#else
using StreamOffset = __int64;
#endif
enum class StreamSeek {
cur = SEEK_CUR,