diff --git a/demboyz/demofile/demofile.cpp b/demboyz/demofile/demofile.cpp index 091fb3c..767cd66 100644 --- a/demboyz/demofile/demofile.cpp +++ b/demboyz/demofile/demofile.cpp @@ -108,6 +108,11 @@ DemoFileWriter::DemoFileWriter(FILE* fp) : { } +FILE* DemoFileWriter::GetFp() const +{ + return m_demoFp; +} + bool DemoFileWriter::IsOk() const { return ferror(m_demoFp) == 0; diff --git a/demboyz/demofile/demofile.h b/demboyz/demofile/demofile.h index 77e36a2..daeb602 100644 --- a/demboyz/demofile/demofile.h +++ b/demboyz/demofile/demofile.h @@ -32,6 +32,7 @@ class DemoFileWriter public: DemoFileWriter(FILE* fp); + FILE* GetFp() const; bool IsOk() const; void WriteDemoHeader(const demoheader_t& header); void WriteRawData(const uint8_t* buffer, int32_t length); diff --git a/demboyz/io/demowriter.cpp b/demboyz/io/demowriter.cpp index 33012df..dc04dbc 100644 --- a/demboyz/io/demowriter.cpp +++ b/demboyz/io/demowriter.cpp @@ -9,6 +9,30 @@ #include #include +#ifdef _WIN32 +#include +#else +#include +#endif +#include + +int truncate(FILE* fp, int relative_offset) +{ + fflush(fp); +#ifdef _WIN32 + const int fd = _fileno(fp); +#else + const int fd = fileno(fp); +#endif + struct stat statbuf; + fstat(fd, &statbuf); +#ifdef _WIN32 + return _chsize_s(fd, statbuf.st_size + relative_offset); +#else + return ftruncate(fd, statbuf.st_size + relative_offset); +#endif +} + class DemoWriter: public IDemoWriter { public: @@ -47,6 +71,9 @@ void DemoWriter::StartWriting(demoheader_t& header) void DemoWriter::EndWriting() { + // stv demos have a byte chopped off of the end + // i dunno why, just doit + truncate(m_writer.GetFp(), -1); } void DemoWriter::StartCommandPacket(const CommandPacket& packet)