From 98c7a1eea6e3c4c8618fd455edc48d8406d031fe Mon Sep 17 00:00:00 2001 From: elasota Date: Tue, 11 May 2021 19:18:15 -0400 Subject: [PATCH 1/9] Fix MergeGPF missing from simple release --- MakeRelease.bat | 1 + 1 file changed, 1 insertion(+) diff --git a/MakeRelease.bat b/MakeRelease.bat index 6c4becd..efd3230 100644 --- a/MakeRelease.bat +++ b/MakeRelease.bat @@ -21,6 +21,7 @@ copy /Y x64\Release\MakeTimestamp.exe ReleasePkg\Aerofoil\Tools copy /Y x64\Release\FTagData.exe ReleasePkg\Aerofoil\Tools copy /Y x64\Release\gpr2gpa.exe ReleasePkg\Aerofoil\Tools copy /Y x64\Release\unpacktool.exe ReleasePkg\Aerofoil\Tools +copy /Y x64\Release\MergeGPF.exe ReleasePkg\Aerofoil\Tools mkdir ReleasePkg\PDBs From 781c6ce61072edb3a05871101a463cc475aa16fe Mon Sep 17 00:00:00 2001 From: elasota Date: Tue, 11 May 2021 19:18:24 -0400 Subject: [PATCH 2/9] Fix missing return value --- GpApp/House.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/GpApp/House.cpp b/GpApp/House.cpp index f00ccc5..3930ea5 100644 --- a/GpApp/House.cpp +++ b/GpApp/House.cpp @@ -264,6 +264,8 @@ Boolean InitializeEmptyHouseInEditor (void) UpdateMenus(false); ReflectCurrentRoom(true); + + return (true); } #endif From e7b02f37a57591d0aa4397fa66786894aeca0be9 Mon Sep 17 00:00:00 2001 From: elasota Date: Tue, 11 May 2021 19:40:46 -0400 Subject: [PATCH 3/9] Fix memory corruption when creating a new house --- GpApp/House.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GpApp/House.cpp b/GpApp/House.cpp index 3930ea5..6251468 100644 --- a/GpApp/House.cpp +++ b/GpApp/House.cpp @@ -214,7 +214,7 @@ Boolean InitializeEmptyHouse (void) if (thisHouse != nil) thisHouse.Dispose(); - const size_t houseSizeNoRooms = sizeof(sizeof(houseType) - sizeof(roomType)); + const size_t houseSizeNoRooms = sizeof(houseType) - sizeof(roomType); thisHouse = NewHandle(houseSizeNoRooms).StaticCast(); if (thisHouse == nil) From 95260f8d8af0ed575af247a04d87c35470c89020 Mon Sep 17 00:00:00 2001 From: elasota Date: Tue, 11 May 2021 19:47:05 -0400 Subject: [PATCH 4/9] Zero out structures when creating houses and rooms --- GpApp/House.cpp | 1 + GpApp/Room.cpp | 2 ++ GpApp/StructuresInit2.cpp | 2 ++ 3 files changed, 5 insertions(+) diff --git a/GpApp/House.cpp b/GpApp/House.cpp index 6251468..e332bb6 100644 --- a/GpApp/House.cpp +++ b/GpApp/House.cpp @@ -224,6 +224,7 @@ Boolean InitializeEmptyHouse (void) } thisHousePtr = *thisHouse; + memset(thisHousePtr, 0, houseSizeNoRooms); thisHousePtr->version = kHouseVersion; thisHousePtr->firstRoom = -1; diff --git a/GpApp/Room.cpp b/GpApp/Room.cpp index 0e806d1..a5259f6 100644 --- a/GpApp/Room.cpp +++ b/GpApp/Room.cpp @@ -171,6 +171,8 @@ Boolean CreateNewRoom (short h, short v) char wasState; CopyThisRoomToRoom(); // save off current room + + memset(thisRoom, 0, sizeof(roomType)); PasStringCopy(PSTR("Untitled Room"), thisRoom->name); thisRoom->leftStart = 32; // fill out fields of new room diff --git a/GpApp/StructuresInit2.cpp b/GpApp/StructuresInit2.cpp index 21051e9..40312fe 100644 --- a/GpApp/StructuresInit2.cpp +++ b/GpApp/StructuresInit2.cpp @@ -182,6 +182,8 @@ void CreatePointers (void) thisRoom = (roomPtr)NewPtr(sizeof(roomType)); if (thisRoom == nil) RedAlert(kErrNoMemory); + + memset(thisRoom, 0, sizeof(roomType)); hotSpots = nil; hotSpots = (hotPtr)NewPtr(sizeof(hotObject) * kMaxHotSpots); From 32ff2f6fe85674511692b54ce232a4fc69edfa9b Mon Sep 17 00:00:00 2001 From: elasota Date: Tue, 11 May 2021 21:27:40 -0400 Subject: [PATCH 5/9] Finish clearing out std::vector from PortabilityLayer --- PortabilityLayer/BinHex4.cpp | 54 ++-- PortabilityLayer/BinHex4.h | 8 +- PortabilityLayer/MacBinary2.cpp | 18 +- PortabilityLayer/MacBinary2.h | 3 +- PortabilityLayer/MacFileMem.cpp | 57 +++- PortabilityLayer/MacFileMem.h | 33 ++- PortabilityLayer/PortabilityLayer.vcxproj | 1 - .../PortabilityLayer.vcxproj.filters | 3 - PortabilityLayer/ScopedArray.h | 83 ------ PortabilityLayer/ScopedPtr.h | 11 +- bin2gp/bin2gp.cpp | 261 +++++++++--------- bin2gp/bin2gp.vcxproj | 3 + bin2gp/bin2gp.vcxproj.filters | 3 + flattenmov/flattenmov.cpp | 12 +- flattenmov/flattenmov.vcxproj | 3 + flattenmov/flattenmov.vcxproj.filters | 3 + hqx2bin/hqx2bin.cpp | 5 +- hqx2bin/hqx2bin.vcxproj | 3 + hqx2bin/hqx2bin.vcxproj.filters | 3 + hqx2gp/hqx2gp.cpp | 3 +- hqx2gp/hqx2gp.vcxproj | 3 + hqx2gp/hqx2gp.vcxproj.filters | 3 + 22 files changed, 280 insertions(+), 296 deletions(-) delete mode 100644 PortabilityLayer/ScopedArray.h diff --git a/PortabilityLayer/BinHex4.cpp b/PortabilityLayer/BinHex4.cpp index 8e75437..3cf016e 100644 --- a/PortabilityLayer/BinHex4.cpp +++ b/PortabilityLayer/BinHex4.cpp @@ -1,8 +1,8 @@ #include "BinHex4.h" #include "GpIOStream.h" +#include "GpVector.h" #include -#include #include // See: https://files.stairways.com/other/binhex-40-specs-info.txt @@ -59,7 +59,7 @@ namespace namespace PortabilityLayer { - MacFileMem *BinHex4::LoadHQX(GpIOStream *stream) + MacFileMem *BinHex4::LoadHQX(GpIOStream *stream, IGpAllocator *alloc) { const uint8_t errCodeChar = 64; @@ -108,7 +108,7 @@ namespace PortabilityLayer return nullptr; } - std::vector bytesAfter6To8; + GpVector bytesAfter6To8(alloc); if (stream->IsSeekable()) { @@ -120,7 +120,10 @@ namespace PortabilityLayer return nullptr; if (endPos > filePos && (endPos - filePos) < SIZE_MAX / 6) - bytesAfter6To8.reserve(static_cast(endPos - filePos) * 6 / 8); + { + if (!bytesAfter6To8.Reserve(static_cast(endPos - filePos) * 6 / 8)) + return nullptr; + } } } @@ -170,19 +173,22 @@ namespace PortabilityLayer break; case 6: decodedByte |= value6Bit; - bytesAfter6To8.push_back(decodedByte); + if (!bytesAfter6To8.Append(decodedByte)) + return nullptr; decodedByte = 0; decodedByteBitPos = 8; break; case 4: decodedByte |= (value6Bit >> 2); - bytesAfter6To8.push_back(decodedByte); + if (!bytesAfter6To8.Append(decodedByte)) + return nullptr; decodedByte = (value6Bit << 6) & 0xff; decodedByteBitPos = 6; break; case 2: decodedByte |= (value6Bit >> 4); - bytesAfter6To8.push_back(decodedByte); + if (!bytesAfter6To8.Append(decodedByte)) + return nullptr; decodedByte = (value6Bit << 4) & 0xff; decodedByteBitPos = 4; break; @@ -191,7 +197,7 @@ namespace PortabilityLayer } } - const size_t bytesBeforeRLEDec = bytesAfter6To8.size(); + const size_t bytesBeforeRLEDec = bytesAfter6To8.Count(); size_t decodedDataSize = 0; for (size_t i = 0; i < bytesBeforeRLEDec; i++) { @@ -212,8 +218,9 @@ namespace PortabilityLayer decodedDataSize++; } - std::vector decodedBytes; - decodedBytes.reserve(decodedDataSize); + GpVector decodedBytes(alloc); + if (!decodedBytes.Reserve(decodedDataSize)) + return nullptr; for (size_t i = 0; i < bytesBeforeRLEDec; i++) { @@ -224,28 +231,37 @@ namespace PortabilityLayer const uint8_t runLength = bytesAfter6To8[++i]; if (runLength == 0) - decodedBytes.push_back(0x90); + { + if (!decodedBytes.Append(0x90)) + return nullptr; + } else { - if (decodedBytes.size() == 0) + if (decodedBytes.Count() == 0) return nullptr; - const uint8_t lastByte = *(decodedBytes.end() - 1); + const uint8_t lastByte = decodedBytes[decodedBytes.Count() - 1]; for (size_t r = 1; r < runLength; r++) - decodedBytes.push_back(lastByte); + { + if (!decodedBytes.Append(lastByte)) + return nullptr; + } } } else - decodedBytes.push_back(b); + { + if (!decodedBytes.Append(b)) + return nullptr; + } } assert(decodedBytes.size() == decodedDataSize); - if (decodedBytes.size() == 0) + if (decodedBytes.Count() == 0) return nullptr; const uint8_t nameLength = decodedBytes[0]; - if (decodedBytes.size() < 22 + nameLength || nameLength > 63) + if (decodedBytes.Count() < 22 + nameLength || nameLength > 63) return nullptr; // Header format: @@ -272,7 +288,7 @@ namespace PortabilityLayer mfi.m_dataForkSize = ByteUnpack::BigUInt32(&decodedBytes[headerStartLoc + 10]); mfi.m_resourceForkSize = ByteUnpack::BigUInt32(&decodedBytes[headerStartLoc + 14]); - const size_t availableDataSize = decodedBytes.size() - 26 - nameLength; // +4 bytes for CRCs + const size_t availableDataSize = decodedBytes.Count() - 26 - nameLength; // +4 bytes for CRCs if (mfi.m_dataForkSize > availableDataSize || availableDataSize - mfi.m_dataForkSize < mfi.m_resourceForkSize) return nullptr; @@ -297,6 +313,6 @@ namespace PortabilityLayer if (expectedResCRC != BinHexCRC(&decodedBytes[resourceForkStart], mfi.m_resourceForkSize)) return nullptr; - return new MacFileMem(&decodedBytes[dataForkStart], &decodedBytes[resourceForkStart], nullptr, mfi); + return MacFileMem::Create(alloc, &decodedBytes[dataForkStart], &decodedBytes[resourceForkStart], nullptr, mfi); } } diff --git a/PortabilityLayer/BinHex4.h b/PortabilityLayer/BinHex4.h index 10aaebe..0694378 100644 --- a/PortabilityLayer/BinHex4.h +++ b/PortabilityLayer/BinHex4.h @@ -1,9 +1,7 @@ #pragma once -#ifndef __PL_BINHEX4_H__ -#define __PL_BINHEX4_H__ - class GpIOStream; +struct IGpAllocator; namespace PortabilityLayer { @@ -11,8 +9,6 @@ namespace PortabilityLayer namespace BinHex4 { - MacFileMem *LoadHQX(GpIOStream *stream); + MacFileMem *LoadHQX(GpIOStream *stream, IGpAllocator *alloc); }; } - -#endif diff --git a/PortabilityLayer/MacBinary2.cpp b/PortabilityLayer/MacBinary2.cpp index b43f81d..228e4fc 100644 --- a/PortabilityLayer/MacBinary2.cpp +++ b/PortabilityLayer/MacBinary2.cpp @@ -106,7 +106,7 @@ namespace PortabilityLayer stream->Write(padding, resourceForkPadding); } - MacFileMem *MacBinary2::ReadBin(GpIOStream *stream) + MacFileMem *MacBinary2::ReadBin(GpIOStream *stream, IGpAllocator *alloc) { MacFileInfo fileInfo; @@ -153,37 +153,35 @@ namespace PortabilityLayer if (fileInfo.m_resourceForkSize > SIZE_MAX) return nullptr; - uint8_t *dataBuffer = nullptr; - uint8_t *rsrcBuffer = nullptr; + GpVector dataBuffer(alloc); + GpVector rsrcBuffer(alloc); if (fileInfo.m_dataForkSize != 0) - dataBuffer = new uint8_t[fileInfo.m_dataForkSize]; + dataBuffer.Resize(fileInfo.m_dataForkSize); if (fileInfo.m_resourceForkSize != 0) - rsrcBuffer = new uint8_t[fileInfo.m_resourceForkSize]; + rsrcBuffer.Resize(fileInfo.m_resourceForkSize); - ScopedArray dataContents(dataBuffer); - ScopedArray rsrcContents(rsrcBuffer); uint8_t *padding = mb2Header; const size_t dataForkPadding = 127 - ((fileInfo.m_dataForkSize + 127) % 128); const size_t resourceForkPadding = 127 - ((fileInfo.m_resourceForkSize + 127) % 128); - if (stream->Read(dataBuffer, fileInfo.m_dataForkSize) != fileInfo.m_dataForkSize) + if (stream->Read(dataBuffer.Buffer(), fileInfo.m_dataForkSize) != fileInfo.m_dataForkSize) return nullptr; if (stream->Read(padding, dataForkPadding) != dataForkPadding) return nullptr; - if (stream->Read(rsrcBuffer, fileInfo.m_resourceForkSize) != fileInfo.m_resourceForkSize) + if (stream->Read(rsrcBuffer.Buffer(), fileInfo.m_resourceForkSize) != fileInfo.m_resourceForkSize) return nullptr; if (stream->Read(padding, resourceForkPadding) != resourceForkPadding) return nullptr; // Ignore comment for now - return new MacFileMem(dataBuffer, rsrcBuffer, nullptr, fileInfo); + return MacFileMem::Create(alloc, dataBuffer.Buffer(), rsrcBuffer.Buffer(), nullptr, fileInfo); } } diff --git a/PortabilityLayer/MacBinary2.h b/PortabilityLayer/MacBinary2.h index bcb6bdb..04ca36e 100644 --- a/PortabilityLayer/MacBinary2.h +++ b/PortabilityLayer/MacBinary2.h @@ -1,6 +1,7 @@ #pragma once class GpIOStream; +struct IGpAllocator; namespace PortabilityLayer { @@ -14,6 +15,6 @@ namespace PortabilityLayer void SerializeHeader(unsigned char *headerBytes, const MacFileInfo &macFileInfo); void WriteBin(const MacFileMem *file, GpIOStream *stream); - MacFileMem *ReadBin(GpIOStream *stream); + MacFileMem *ReadBin(GpIOStream *stream, IGpAllocator *alloc); }; } diff --git a/PortabilityLayer/MacFileMem.cpp b/PortabilityLayer/MacFileMem.cpp index 7784ac6..d87c280 100644 --- a/PortabilityLayer/MacFileMem.cpp +++ b/PortabilityLayer/MacFileMem.cpp @@ -1,26 +1,59 @@ #include "MacFileMem.h" namespace PortabilityLayer -{ - MacFileMem::MacFileMem(const uint8_t *dataFork, const uint8_t *resourceFork, const char* comment, const MacFileInfo &fileInfo) - : m_info(fileInfo) +{ + MacFileMem::MacFileMem(IGpAllocator *alloc, const MacFileInfo &fileInfo) + : m_alloc(alloc) + , m_info(fileInfo) + , m_data(alloc) { - uint8_t *buffer = new uint8_t[fileInfo.m_dataForkSize + fileInfo.m_resourceForkSize + fileInfo.m_commentSize + 1]; - m_data.Set(buffer); + } - memcpy(buffer, dataFork, fileInfo.m_dataForkSize); - buffer += fileInfo.m_dataForkSize; + bool MacFileMem::Init(const uint8_t *dataFork, const uint8_t *resourceFork, const char* comment) + { + const size_t combinedSize = m_info.m_dataForkSize + m_info.m_resourceForkSize + m_info.m_commentSize + 1; + if (!m_data.Resize(combinedSize)) + return false; + + uint8_t *buffer = m_data.Buffer(); + memcpy(buffer, dataFork, m_info.m_dataForkSize); + buffer += m_info.m_dataForkSize; - memcpy(buffer, resourceFork, fileInfo.m_resourceForkSize); - buffer += fileInfo.m_resourceForkSize; + memcpy(buffer, resourceFork, m_info.m_resourceForkSize); + buffer += m_info.m_resourceForkSize; - memcpy(buffer, comment, fileInfo.m_commentSize); - buffer += fileInfo.m_commentSize; + memcpy(buffer, comment, m_info.m_commentSize); + buffer += m_info.m_commentSize; - *buffer = 0; + *buffer = 0; + + return true; } MacFileMem::~MacFileMem() { + } + + MacFileMem *MacFileMem::Create(IGpAllocator *alloc, const uint8_t *dataFork, const uint8_t *resourceFork, const char* comment, const MacFileInfo &fileInfo) + { + void *storage = alloc->Alloc(sizeof(MacFileMem)); + if (!storage) + return nullptr; + + MacFileMem *result = new (storage) MacFileMem(alloc, fileInfo); + if (!result->Init(dataFork, resourceFork, comment)) + { + result->Destroy(); + return nullptr; + } + + return result; + } + + void MacFileMem::Destroy() + { + IGpAllocator *alloc = m_alloc; + this->~MacFileMem(); + alloc->Release(this); } } diff --git a/PortabilityLayer/MacFileMem.h b/PortabilityLayer/MacFileMem.h index d7f2f3d..ace2759 100644 --- a/PortabilityLayer/MacFileMem.h +++ b/PortabilityLayer/MacFileMem.h @@ -1,28 +1,33 @@ #pragma once -#ifndef __PL_MACFILEMEM_H__ -#define __PL_MACFILEMEM_H__ - #include "DataTypes.h" #include "MacFileInfo.h" -#include "ScopedArray.h" +#include "GpVector.h" + +struct IGpAllocator; namespace PortabilityLayer { class MacFileMem { public: - MacFileMem(const uint8_t *dataFork, const uint8_t *resourceFork, const char* comment, const MacFileInfo &fileInfo); - ~MacFileMem(); - const MacFileInfo &FileInfo() const; const uint8_t *DataFork() const; const uint8_t *ResourceFork() const; - const char *Comment() const; + const char *Comment() const; + + static MacFileMem *Create(IGpAllocator *alloc, const uint8_t *dataFork, const uint8_t *resourceFork, const char* comment, const MacFileInfo &fileInfo); + void Destroy(); private: - ScopedArray m_data; - MacFileInfo m_info; + MacFileMem(IGpAllocator *alloc, const MacFileInfo &fileInfo); + ~MacFileMem(); + + bool Init(const uint8_t *dataFork, const uint8_t *resourceFork, const char* comment); + + GpVector m_data; + MacFileInfo m_info; + IGpAllocator *m_alloc; }; } @@ -35,18 +40,16 @@ namespace PortabilityLayer inline const uint8_t *MacFileMem::DataFork() const { - return m_data; + return m_data.Buffer(); } inline const uint8_t *MacFileMem::ResourceFork() const { - return m_data + m_info.m_dataForkSize; + return m_data.Buffer() + m_info.m_dataForkSize; } inline const char *MacFileMem::Comment() const { - return reinterpret_cast(m_data + m_info.m_dataForkSize + m_info.m_resourceForkSize); + return reinterpret_cast(m_data.Buffer() + m_info.m_dataForkSize + m_info.m_resourceForkSize); } } - -#endif diff --git a/PortabilityLayer/PortabilityLayer.vcxproj b/PortabilityLayer/PortabilityLayer.vcxproj index 6d4d862..ab2bac6 100644 --- a/PortabilityLayer/PortabilityLayer.vcxproj +++ b/PortabilityLayer/PortabilityLayer.vcxproj @@ -209,7 +209,6 @@ - diff --git a/PortabilityLayer/PortabilityLayer.vcxproj.filters b/PortabilityLayer/PortabilityLayer.vcxproj.filters index 73b1f28..ecf6b7c 100644 --- a/PortabilityLayer/PortabilityLayer.vcxproj.filters +++ b/PortabilityLayer/PortabilityLayer.vcxproj.filters @@ -42,9 +42,6 @@ Header Files - - Header Files - Header Files diff --git a/PortabilityLayer/ScopedArray.h b/PortabilityLayer/ScopedArray.h deleted file mode 100644 index b5f660b..0000000 --- a/PortabilityLayer/ScopedArray.h +++ /dev/null @@ -1,83 +0,0 @@ -#pragma once - -#ifndef __PL_SCOPEDARRAY_H__ -#define __PL_SCOPEDARRAY_H__ - -#include "CoreDefs.h" - -namespace PortabilityLayer -{ - template - class ScopedArray - { - public: - ScopedArray(); - ScopedArray(T *ref); - ~ScopedArray(); - - void Swap(ScopedArray &other); - - operator T*(); - operator const T*() const; - - void Set(T *ref); - - private: - ScopedArray(const ScopedArray &other) GP_DELETED; - void operator=(const ScopedArray &other) GP_DELETED; - T *m_ref; - }; -} - -namespace PortabilityLayer -{ - template - inline ScopedArray::ScopedArray() - : m_ref(nullptr) - { - } - - template - inline ScopedArray::ScopedArray(T *ref) - : m_ref(ref) - { - } - - template - inline ScopedArray::~ScopedArray() - { - if (m_ref) - delete[] m_ref; - } - - template - inline void ScopedArray::Swap(ScopedArray &other) - { - T *temp = m_ref; - m_ref = other.m_ref; - other.m_ref = temp; - } - - template - inline ScopedArray::operator T*() - { - return m_ref; - } - - template - inline ScopedArray::operator const T*() const - { - return m_ref; - } - - template - inline void ScopedArray::Set(T *ref) - { - if (m_ref && m_ref != ref) - delete m_ref; - - m_ref = ref; - } -} - -#endif diff --git a/PortabilityLayer/ScopedPtr.h b/PortabilityLayer/ScopedPtr.h index 33fa271..698be4d 100644 --- a/PortabilityLayer/ScopedPtr.h +++ b/PortabilityLayer/ScopedPtr.h @@ -1,8 +1,5 @@ #pragma once -#ifndef __PL_SCOPEDPTR_H__ -#define __PL_SCOPEDPTR_H__ - #include "CoreDefs.h" namespace PortabilityLayer @@ -49,7 +46,7 @@ namespace PortabilityLayer inline ScopedPtr::~ScopedPtr() { if (m_ref) - delete m_ref; + m_ref->Destroy(); } template @@ -87,11 +84,9 @@ namespace PortabilityLayer template inline void ScopedPtr::Set(T *ref) { - if (m_ref && m_ref != ref) - delete m_ref; + if (m_ref && m_ref != ref) + m_ref->Destroy(); m_ref = ref; } } - -#endif diff --git a/bin2gp/bin2gp.cpp b/bin2gp/bin2gp.cpp index 42825f0..16e9b75 100644 --- a/bin2gp/bin2gp.cpp +++ b/bin2gp/bin2gp.cpp @@ -1,146 +1,147 @@ -#include - -/* -Copyright 2019 Eric Lasota - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*/ - +#include + +/* +Copyright 2019 Eric Lasota + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + #include "CFileStream.h" -#include "CombinedTimestamp.h" -#include "ScopedPtr.h" -#include "MacBinary2.h" -#include "MacFileMem.h" - -#include - -using namespace PortabilityLayer; - -int main(int argc, const char **argv) -{ - if (argc != 4) - { - fprintf(stderr, "Usage: bin2gp "); - return -1; - } - -#ifdef _CRT_INSECURE_DEPRECATE - FILE *f = nullptr; - if (fopen_s(&f, argv[1], "rb")) - f = nullptr; -#else - FILE *f = fopen(argv[1], "rb"); -#endif - - if (!f) - { - fprintf(stderr, "Could not open input file"); - return -1; - } - -#ifdef _CRT_INSECURE_DEPRECATE - FILE *tsF = nullptr; - if (fopen_s(&tsF, argv[2], "rb")) - tsF = nullptr; -#else - FILE *tsF = fopen(argv[2], "rb"); -#endif - - if (!tsF) - { - fprintf(stderr, "Could not open timestamp file"); - return -1; +#include "CombinedTimestamp.h" +#include "ScopedPtr.h" +#include "MacBinary2.h" +#include "MacFileMem.h" +#include "GpAllocator_C.h" + +#include + +using namespace PortabilityLayer; + +int main(int argc, const char **argv) +{ + if (argc != 4) + { + fprintf(stderr, "Usage: bin2gp "); + return -1; + } + +#ifdef _CRT_INSECURE_DEPRECATE + FILE *f = nullptr; + if (fopen_s(&f, argv[1], "rb")) + f = nullptr; +#else + FILE *f = fopen(argv[1], "rb"); +#endif + + if (!f) + { + fprintf(stderr, "Could not open input file"); + return -1; + } + +#ifdef _CRT_INSECURE_DEPRECATE + FILE *tsF = nullptr; + if (fopen_s(&tsF, argv[2], "rb")) + tsF = nullptr; +#else + FILE *tsF = fopen(argv[2], "rb"); +#endif + + if (!tsF) + { + fprintf(stderr, "Could not open timestamp file"); + return -1; } PortabilityLayer::CombinedTimestamp ts; if (!fread(&ts, sizeof(ts), 1, tsF)) { fprintf(stderr, "Could not read timestamp"); - return -1; - } - - CFileStream fs(f, true, false, true); - - ScopedPtr memFile = MacBinary2::ReadBin(&fs); - - fs.Close(); - - std::string fname = argv[3]; - - const char* extensions[] = { ".gpf", ".gpr", ".gpd", ".gpc" }; - - MacFilePropertiesSerialized sp; - sp.Serialize(memFile->FileInfo().m_properties); - - for (int i = 0; i < 4; i++) - { - const void *bufferToWrite = nullptr; - size_t sizeToWrite = 0; - - switch (i) - { - case 0: - bufferToWrite = sp.m_data; - sizeToWrite = sp.kSize; - break; - case 1: - bufferToWrite = memFile->ResourceFork(); - sizeToWrite = memFile->FileInfo().m_resourceForkSize; - break; - case 2: - bufferToWrite = memFile->DataFork(); - sizeToWrite = memFile->FileInfo().m_dataForkSize; - break; - case 3: - bufferToWrite = memFile->Comment(); - sizeToWrite = memFile->FileInfo().m_commentSize; - break; - }; - - if (sizeToWrite == 0) - continue; - - std::string path = fname + extensions[i]; - -#ifdef _CRT_INSECURE_DEPRECATE - FILE *outF = nullptr; - if (fopen_s(&outF, path.c_str(), "wb")) - outF = nullptr; -#else - FILE *outF = fopen(path.c_str(), "wb"); -#endif - - if (!outF) + return -1; + } + + CFileStream fs(f, true, false, true); + + ScopedPtr memFile = MacBinary2::ReadBin(&fs, GpAllocator_C::GetInstance()); + + fs.Close(); + + std::string fname = argv[3]; + + const char* extensions[] = { ".gpf", ".gpr", ".gpd", ".gpc" }; + + MacFilePropertiesSerialized sp; + sp.Serialize(memFile->FileInfo().m_properties); + + for (int i = 0; i < 4; i++) + { + const void *bufferToWrite = nullptr; + size_t sizeToWrite = 0; + + switch (i) + { + case 0: + bufferToWrite = sp.m_data; + sizeToWrite = sp.kSize; + break; + case 1: + bufferToWrite = memFile->ResourceFork(); + sizeToWrite = memFile->FileInfo().m_resourceForkSize; + break; + case 2: + bufferToWrite = memFile->DataFork(); + sizeToWrite = memFile->FileInfo().m_dataForkSize; + break; + case 3: + bufferToWrite = memFile->Comment(); + sizeToWrite = memFile->FileInfo().m_commentSize; + break; + }; + + if (sizeToWrite == 0) + continue; + + std::string path = fname + extensions[i]; + +#ifdef _CRT_INSECURE_DEPRECATE + FILE *outF = nullptr; + if (fopen_s(&outF, path.c_str(), "wb")) + outF = nullptr; +#else + FILE *outF = fopen(path.c_str(), "wb"); +#endif + + if (!outF) continue; if (i == 0) { CFileStream stream(outF); sp.WriteAsPackage(stream, ts); - stream.Close(); + stream.Close(); } else - { - fwrite(bufferToWrite, 1, sizeToWrite, outF); + { + fwrite(bufferToWrite, 1, sizeToWrite, outF); fclose(outF); - } - } - - return 0; -} + } + } + + return 0; +} diff --git a/bin2gp/bin2gp.vcxproj b/bin2gp/bin2gp.vcxproj index 39c6a20..6cdd940 100644 --- a/bin2gp/bin2gp.vcxproj +++ b/bin2gp/bin2gp.vcxproj @@ -41,6 +41,7 @@ + @@ -48,6 +49,7 @@ + @@ -74,6 +76,7 @@ + diff --git a/bin2gp/bin2gp.vcxproj.filters b/bin2gp/bin2gp.vcxproj.filters index 4b25d5e..55b22e6 100644 --- a/bin2gp/bin2gp.vcxproj.filters +++ b/bin2gp/bin2gp.vcxproj.filters @@ -18,5 +18,8 @@ Source Files + + Source Files + \ No newline at end of file diff --git a/flattenmov/flattenmov.cpp b/flattenmov/flattenmov.cpp index 4e42ad6..0c7b24b 100644 --- a/flattenmov/flattenmov.cpp +++ b/flattenmov/flattenmov.cpp @@ -4,6 +4,8 @@ #include "MemReaderStream.h" #include "ResourceCompiledTypeList.h" #include "ResourceFile.h" +#include "ScopedPtr.h" +#include "GpAllocator_C.h" #include @@ -48,15 +50,15 @@ int main(int argc, const char **argv) mfi.m_resourceForkSize = resSize; mfi.m_commentSize = 0; - PortabilityLayer::MacFileMem memFile(dataFork, resFork, nullptr, mfi); + PortabilityLayer::ScopedPtr memFile = PortabilityLayer::MacFileMem::Create(GpAllocator_C::GetInstance(), dataFork, resFork, nullptr, mfi); delete[] dataFork; delete[] resFork; - const uint8_t *dataBytes = memFile.DataFork(); + const uint8_t *dataBytes = memFile->DataFork(); if (dataBytes[0] == 0 && dataBytes[1] == 0 && dataBytes[2] == 0 && dataBytes[3] == 0) { - uint32_t mdatSize = memFile.FileInfo().m_dataForkSize; + uint32_t mdatSize = memFile->FileInfo().m_dataForkSize; uint8_t mdatSizeEncoded[4]; mdatSizeEncoded[0] = ((mdatSize >> 24) & 0xff); mdatSizeEncoded[1] = ((mdatSize >> 16) & 0xff); @@ -65,7 +67,7 @@ int main(int argc, const char **argv) PortabilityLayer::ResourceFile *rf = PortabilityLayer::ResourceFile::Create(); - PortabilityLayer::MemReaderStream resStream(memFile.ResourceFork(), memFile.FileInfo().m_resourceForkSize); + PortabilityLayer::MemReaderStream resStream(memFile->ResourceFork(), memFile->FileInfo().m_resourceForkSize); rf->Load(&resStream); const PortabilityLayer::ResourceCompiledTypeList *typeList = rf->GetResourceTypeList(PortabilityLayer::ResTypeID('moov')); @@ -102,7 +104,7 @@ int main(int argc, const char **argv) return -1; } - fwrite(dataBytes, 1, memFile.FileInfo().m_dataForkSize, outF); + fwrite(dataBytes, 1, memFile->FileInfo().m_dataForkSize, outF); fclose(outF); } diff --git a/flattenmov/flattenmov.vcxproj b/flattenmov/flattenmov.vcxproj index 7cb639e..bc58c83 100644 --- a/flattenmov/flattenmov.vcxproj +++ b/flattenmov/flattenmov.vcxproj @@ -41,6 +41,7 @@ + @@ -48,6 +49,7 @@ + @@ -74,6 +76,7 @@ + diff --git a/flattenmov/flattenmov.vcxproj.filters b/flattenmov/flattenmov.vcxproj.filters index 8e4152d..2b2a282 100644 --- a/flattenmov/flattenmov.vcxproj.filters +++ b/flattenmov/flattenmov.vcxproj.filters @@ -18,5 +18,8 @@ Source Files + + Source Files + \ No newline at end of file diff --git a/hqx2bin/hqx2bin.cpp b/hqx2bin/hqx2bin.cpp index 270811f..0ae5966 100644 --- a/hqx2bin/hqx2bin.cpp +++ b/hqx2bin/hqx2bin.cpp @@ -26,7 +26,8 @@ SOFTWARE. #include "ScopedPtr.h" #include "BinHex4.h" #include "MacBinary2.h" -#include "MacFileMem.h" +#include "MacFileMem.h" +#include "GpAllocator_C.h" using namespace PortabilityLayer; @@ -54,7 +55,7 @@ int main(int argc, const char **argv) CFileStream fs(f, true, false, true); - ScopedPtr memFile = BinHex4::LoadHQX(&fs); + ScopedPtr memFile = BinHex4::LoadHQX(&fs, GpAllocator_C::GetInstance()); fs.Close(); diff --git a/hqx2bin/hqx2bin.vcxproj b/hqx2bin/hqx2bin.vcxproj index 2cc7117..8af67fb 100644 --- a/hqx2bin/hqx2bin.vcxproj +++ b/hqx2bin/hqx2bin.vcxproj @@ -41,6 +41,7 @@ + @@ -48,6 +49,7 @@ + @@ -74,6 +76,7 @@ + diff --git a/hqx2bin/hqx2bin.vcxproj.filters b/hqx2bin/hqx2bin.vcxproj.filters index 764ae5e..ddef52a 100644 --- a/hqx2bin/hqx2bin.vcxproj.filters +++ b/hqx2bin/hqx2bin.vcxproj.filters @@ -18,5 +18,8 @@ Source Files + + Source Files + \ No newline at end of file diff --git a/hqx2gp/hqx2gp.cpp b/hqx2gp/hqx2gp.cpp index 30e52e0..7493d6b 100644 --- a/hqx2gp/hqx2gp.cpp +++ b/hqx2gp/hqx2gp.cpp @@ -25,6 +25,7 @@ SOFTWARE. #include "CFileStream.h" #include "CombinedTimestamp.h" #include "DeflateCodec.h" +#include "GpAllocator_C.h" #include "ScopedPtr.h" #include "BinHex4.h" #include "MacBinary2.h" @@ -75,7 +76,7 @@ int toolMain(int argc, const char **argv) CFileStream fs(f, true, false, true); - ScopedPtr memFile = BinHex4::LoadHQX(&fs); + ScopedPtr memFile = BinHex4::LoadHQX(&fs, GpAllocator_C::GetInstance()); fs.Close(); diff --git a/hqx2gp/hqx2gp.vcxproj b/hqx2gp/hqx2gp.vcxproj index e5df7e6..6b7122a 100644 --- a/hqx2gp/hqx2gp.vcxproj +++ b/hqx2gp/hqx2gp.vcxproj @@ -42,6 +42,7 @@ + @@ -50,6 +51,7 @@ + @@ -76,6 +78,7 @@ + diff --git a/hqx2gp/hqx2gp.vcxproj.filters b/hqx2gp/hqx2gp.vcxproj.filters index 721f55e..978539a 100644 --- a/hqx2gp/hqx2gp.vcxproj.filters +++ b/hqx2gp/hqx2gp.vcxproj.filters @@ -18,5 +18,8 @@ Source Files + + Source Files + \ No newline at end of file From e8565a122d2cf91b9d0b3e68aa185071d22e6c70 Mon Sep 17 00:00:00 2001 From: elasota Date: Tue, 11 May 2021 21:32:00 -0400 Subject: [PATCH 6/9] EOL fix --- gpr2gpa/macedec.cpp | 446 ++++++++++++++++++++++---------------------- 1 file changed, 223 insertions(+), 223 deletions(-) diff --git a/gpr2gpa/macedec.cpp b/gpr2gpa/macedec.cpp index e20b029..8c02e4d 100644 --- a/gpr2gpa/macedec.cpp +++ b/gpr2gpa/macedec.cpp @@ -1,238 +1,238 @@ -/* +/* * MACE decoder - * Based on FFmpeg MACE decoder - * Copyright (c) 2002 Laszlo Torok - * - * FFmpeg is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * FFmpeg is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -/* - * Adapted to libavcodec by Francois Revol - * (removed 68k REG stuff, changed types, added some statics and consts, - * libavcodec api, context stuff, interlaced stereo out). + * Based on FFmpeg MACE decoder + * Copyright (c) 2002 Laszlo Torok + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +/* + * Adapted to libavcodec by Francois Revol + * (removed 68k REG stuff, changed types, added some statics and consts, + * libavcodec api, context stuff, interlaced stereo out). */ #include #include -#include "macedec.h" - -static const int16_t MACEtab1[] = {-13, 8, 76, 222, 222, 76, 8, -13}; - -static const int16_t MACEtab3[] = {-18, 140, 140, -18}; - -static const int16_t MACEtab2[][4] = { - { 37, 116, 206, 330}, { 39, 121, 216, 346}, - { 41, 127, 225, 361}, { 42, 132, 235, 377}, - { 44, 137, 245, 392}, { 46, 144, 256, 410}, - { 48, 150, 267, 428}, { 51, 157, 280, 449}, - { 53, 165, 293, 470}, { 55, 172, 306, 490}, - { 58, 179, 319, 511}, { 60, 187, 333, 534}, - { 63, 195, 348, 557}, { 66, 205, 364, 583}, - { 69, 214, 380, 609}, { 72, 223, 396, 635}, - { 75, 233, 414, 663}, { 79, 244, 433, 694}, - { 82, 254, 453, 725}, { 86, 265, 472, 756}, - { 90, 278, 495, 792}, { 94, 290, 516, 826}, - { 98, 303, 538, 862}, { 102, 316, 562, 901}, - { 107, 331, 588, 942}, { 112, 345, 614, 983}, - { 117, 361, 641, 1027}, { 122, 377, 670, 1074}, - { 127, 394, 701, 1123}, { 133, 411, 732, 1172}, - { 139, 430, 764, 1224}, { 145, 449, 799, 1280}, - { 152, 469, 835, 1337}, { 159, 490, 872, 1397}, - { 166, 512, 911, 1459}, { 173, 535, 951, 1523}, - { 181, 558, 993, 1590}, { 189, 584, 1038, 1663}, - { 197, 610, 1085, 1738}, { 206, 637, 1133, 1815}, - { 215, 665, 1183, 1895}, { 225, 695, 1237, 1980}, - { 235, 726, 1291, 2068}, { 246, 759, 1349, 2161}, - { 257, 792, 1409, 2257}, { 268, 828, 1472, 2357}, - { 280, 865, 1538, 2463}, { 293, 903, 1606, 2572}, - { 306, 944, 1678, 2688}, { 319, 986, 1753, 2807}, - { 334, 1030, 1832, 2933}, { 349, 1076, 1914, 3065}, - { 364, 1124, 1999, 3202}, { 380, 1174, 2088, 3344}, - { 398, 1227, 2182, 3494}, { 415, 1281, 2278, 3649}, - { 434, 1339, 2380, 3811}, { 453, 1398, 2486, 3982}, - { 473, 1461, 2598, 4160}, { 495, 1526, 2714, 4346}, - { 517, 1594, 2835, 4540}, { 540, 1665, 2961, 4741}, - { 564, 1740, 3093, 4953}, { 589, 1818, 3232, 5175}, - { 615, 1898, 3375, 5405}, { 643, 1984, 3527, 5647}, - { 671, 2072, 3683, 5898}, { 701, 2164, 3848, 6161}, - { 733, 2261, 4020, 6438}, { 766, 2362, 4199, 6724}, - { 800, 2467, 4386, 7024}, { 836, 2578, 4583, 7339}, - { 873, 2692, 4786, 7664}, { 912, 2813, 5001, 8008}, - { 952, 2938, 5223, 8364}, { 995, 3070, 5457, 8739}, - { 1039, 3207, 5701, 9129}, { 1086, 3350, 5956, 9537}, - { 1134, 3499, 6220, 9960}, { 1185, 3655, 6497, 10404}, - { 1238, 3818, 6788, 10869}, { 1293, 3989, 7091, 11355}, - { 1351, 4166, 7407, 11861}, { 1411, 4352, 7738, 12390}, - { 1474, 4547, 8084, 12946}, { 1540, 4750, 8444, 13522}, - { 1609, 4962, 8821, 14126}, { 1680, 5183, 9215, 14756}, - { 1756, 5415, 9626, 15415}, { 1834, 5657, 10057, 16104}, - { 1916, 5909, 10505, 16822}, { 2001, 6173, 10975, 17574}, - { 2091, 6448, 11463, 18356}, { 2184, 6736, 11974, 19175}, - { 2282, 7037, 12510, 20032}, { 2383, 7351, 13068, 20926}, - { 2490, 7679, 13652, 21861}, { 2601, 8021, 14260, 22834}, - { 2717, 8380, 14897, 23854}, { 2838, 8753, 15561, 24918}, - { 2965, 9144, 16256, 26031}, { 3097, 9553, 16982, 27193}, - { 3236, 9979, 17740, 28407}, { 3380, 10424, 18532, 29675}, - { 3531, 10890, 19359, 31000}, { 3688, 11375, 20222, 32382}, - { 3853, 11883, 21125, 32767}, { 4025, 12414, 22069, 32767}, - { 4205, 12967, 23053, 32767}, { 4392, 13546, 24082, 32767}, - { 4589, 14151, 25157, 32767}, { 4793, 14783, 26280, 32767}, - { 5007, 15442, 27452, 32767}, { 5231, 16132, 28678, 32767}, - { 5464, 16851, 29957, 32767}, { 5708, 17603, 31294, 32767}, - { 5963, 18389, 32691, 32767}, { 6229, 19210, 32767, 32767}, - { 6507, 20067, 32767, 32767}, { 6797, 20963, 32767, 32767}, - { 7101, 21899, 32767, 32767}, { 7418, 22876, 32767, 32767}, - { 7749, 23897, 32767, 32767}, { 8095, 24964, 32767, 32767}, - { 8456, 26078, 32767, 32767}, { 8833, 27242, 32767, 32767}, - { 9228, 28457, 32767, 32767}, { 9639, 29727, 32767, 32767} -}; - -static const int16_t MACEtab4[][2] = { - { 64, 216}, { 67, 226}, { 70, 236}, { 74, 246}, - { 77, 257}, { 80, 268}, { 84, 280}, { 88, 294}, - { 92, 307}, { 96, 321}, { 100, 334}, { 104, 350}, - { 109, 365}, { 114, 382}, { 119, 399}, { 124, 416}, - { 130, 434}, { 136, 454}, { 142, 475}, { 148, 495}, - { 155, 519}, { 162, 541}, { 169, 564}, { 176, 590}, - { 185, 617}, { 193, 644}, { 201, 673}, { 210, 703}, - { 220, 735}, { 230, 767}, { 240, 801}, { 251, 838}, - { 262, 876}, { 274, 914}, { 286, 955}, { 299, 997}, - { 312, 1041}, { 326, 1089}, { 341, 1138}, { 356, 1188}, - { 372, 1241}, { 388, 1297}, { 406, 1354}, { 424, 1415}, - { 443, 1478}, { 462, 1544}, { 483, 1613}, { 505, 1684}, - { 527, 1760}, { 551, 1838}, { 576, 1921}, { 601, 2007}, - { 628, 2097}, { 656, 2190}, { 686, 2288}, { 716, 2389}, - { 748, 2496}, { 781, 2607}, { 816, 2724}, { 853, 2846}, - { 891, 2973}, { 930, 3104}, { 972, 3243}, { 1016, 3389}, - { 1061, 3539}, { 1108, 3698}, { 1158, 3862}, { 1209, 4035}, - { 1264, 4216}, { 1320, 4403}, { 1379, 4599}, { 1441, 4806}, - { 1505, 5019}, { 1572, 5244}, { 1642, 5477}, { 1715, 5722}, - { 1792, 5978}, { 1872, 6245}, { 1955, 6522}, { 2043, 6813}, - { 2134, 7118}, { 2229, 7436}, { 2329, 7767}, { 2432, 8114}, - { 2541, 8477}, { 2655, 8854}, { 2773, 9250}, { 2897, 9663}, - { 3026, 10094}, { 3162, 10546}, { 3303, 11016}, { 3450, 11508}, - { 3604, 12020}, { 3765, 12556}, { 3933, 13118}, { 4108, 13703}, - { 4292, 14315}, { 4483, 14953}, { 4683, 15621}, { 4892, 16318}, - { 5111, 17046}, { 5339, 17807}, { 5577, 18602}, { 5826, 19433}, - { 6086, 20300}, { 6358, 21205}, { 6642, 22152}, { 6938, 23141}, - { 7248, 24173}, { 7571, 25252}, { 7909, 26380}, { 8262, 27557}, - { 8631, 28786}, { 9016, 30072}, { 9419, 31413}, { 9839, 32767}, - { 10278, 32767}, { 10737, 32767}, { 11216, 32767}, { 11717, 32767}, - { 12240, 32767}, { 12786, 32767}, { 13356, 32767}, { 13953, 32767}, - { 14576, 32767}, { 15226, 32767}, { 15906, 32767}, { 16615, 32767} -}; - -static const struct { - const int16_t *tab1; const int16_t *tab2; int stride; -} tabs[] = { - {MACEtab1, &MACEtab2[0][0], 4}, - {MACEtab3, &MACEtab4[0][0], 2}, - {MACEtab1, &MACEtab2[0][0], 4} +#include "macedec.h" + +static const int16_t MACEtab1[] = {-13, 8, 76, 222, 222, 76, 8, -13}; + +static const int16_t MACEtab3[] = {-18, 140, 140, -18}; + +static const int16_t MACEtab2[][4] = { + { 37, 116, 206, 330}, { 39, 121, 216, 346}, + { 41, 127, 225, 361}, { 42, 132, 235, 377}, + { 44, 137, 245, 392}, { 46, 144, 256, 410}, + { 48, 150, 267, 428}, { 51, 157, 280, 449}, + { 53, 165, 293, 470}, { 55, 172, 306, 490}, + { 58, 179, 319, 511}, { 60, 187, 333, 534}, + { 63, 195, 348, 557}, { 66, 205, 364, 583}, + { 69, 214, 380, 609}, { 72, 223, 396, 635}, + { 75, 233, 414, 663}, { 79, 244, 433, 694}, + { 82, 254, 453, 725}, { 86, 265, 472, 756}, + { 90, 278, 495, 792}, { 94, 290, 516, 826}, + { 98, 303, 538, 862}, { 102, 316, 562, 901}, + { 107, 331, 588, 942}, { 112, 345, 614, 983}, + { 117, 361, 641, 1027}, { 122, 377, 670, 1074}, + { 127, 394, 701, 1123}, { 133, 411, 732, 1172}, + { 139, 430, 764, 1224}, { 145, 449, 799, 1280}, + { 152, 469, 835, 1337}, { 159, 490, 872, 1397}, + { 166, 512, 911, 1459}, { 173, 535, 951, 1523}, + { 181, 558, 993, 1590}, { 189, 584, 1038, 1663}, + { 197, 610, 1085, 1738}, { 206, 637, 1133, 1815}, + { 215, 665, 1183, 1895}, { 225, 695, 1237, 1980}, + { 235, 726, 1291, 2068}, { 246, 759, 1349, 2161}, + { 257, 792, 1409, 2257}, { 268, 828, 1472, 2357}, + { 280, 865, 1538, 2463}, { 293, 903, 1606, 2572}, + { 306, 944, 1678, 2688}, { 319, 986, 1753, 2807}, + { 334, 1030, 1832, 2933}, { 349, 1076, 1914, 3065}, + { 364, 1124, 1999, 3202}, { 380, 1174, 2088, 3344}, + { 398, 1227, 2182, 3494}, { 415, 1281, 2278, 3649}, + { 434, 1339, 2380, 3811}, { 453, 1398, 2486, 3982}, + { 473, 1461, 2598, 4160}, { 495, 1526, 2714, 4346}, + { 517, 1594, 2835, 4540}, { 540, 1665, 2961, 4741}, + { 564, 1740, 3093, 4953}, { 589, 1818, 3232, 5175}, + { 615, 1898, 3375, 5405}, { 643, 1984, 3527, 5647}, + { 671, 2072, 3683, 5898}, { 701, 2164, 3848, 6161}, + { 733, 2261, 4020, 6438}, { 766, 2362, 4199, 6724}, + { 800, 2467, 4386, 7024}, { 836, 2578, 4583, 7339}, + { 873, 2692, 4786, 7664}, { 912, 2813, 5001, 8008}, + { 952, 2938, 5223, 8364}, { 995, 3070, 5457, 8739}, + { 1039, 3207, 5701, 9129}, { 1086, 3350, 5956, 9537}, + { 1134, 3499, 6220, 9960}, { 1185, 3655, 6497, 10404}, + { 1238, 3818, 6788, 10869}, { 1293, 3989, 7091, 11355}, + { 1351, 4166, 7407, 11861}, { 1411, 4352, 7738, 12390}, + { 1474, 4547, 8084, 12946}, { 1540, 4750, 8444, 13522}, + { 1609, 4962, 8821, 14126}, { 1680, 5183, 9215, 14756}, + { 1756, 5415, 9626, 15415}, { 1834, 5657, 10057, 16104}, + { 1916, 5909, 10505, 16822}, { 2001, 6173, 10975, 17574}, + { 2091, 6448, 11463, 18356}, { 2184, 6736, 11974, 19175}, + { 2282, 7037, 12510, 20032}, { 2383, 7351, 13068, 20926}, + { 2490, 7679, 13652, 21861}, { 2601, 8021, 14260, 22834}, + { 2717, 8380, 14897, 23854}, { 2838, 8753, 15561, 24918}, + { 2965, 9144, 16256, 26031}, { 3097, 9553, 16982, 27193}, + { 3236, 9979, 17740, 28407}, { 3380, 10424, 18532, 29675}, + { 3531, 10890, 19359, 31000}, { 3688, 11375, 20222, 32382}, + { 3853, 11883, 21125, 32767}, { 4025, 12414, 22069, 32767}, + { 4205, 12967, 23053, 32767}, { 4392, 13546, 24082, 32767}, + { 4589, 14151, 25157, 32767}, { 4793, 14783, 26280, 32767}, + { 5007, 15442, 27452, 32767}, { 5231, 16132, 28678, 32767}, + { 5464, 16851, 29957, 32767}, { 5708, 17603, 31294, 32767}, + { 5963, 18389, 32691, 32767}, { 6229, 19210, 32767, 32767}, + { 6507, 20067, 32767, 32767}, { 6797, 20963, 32767, 32767}, + { 7101, 21899, 32767, 32767}, { 7418, 22876, 32767, 32767}, + { 7749, 23897, 32767, 32767}, { 8095, 24964, 32767, 32767}, + { 8456, 26078, 32767, 32767}, { 8833, 27242, 32767, 32767}, + { 9228, 28457, 32767, 32767}, { 9639, 29727, 32767, 32767} +}; + +static const int16_t MACEtab4[][2] = { + { 64, 216}, { 67, 226}, { 70, 236}, { 74, 246}, + { 77, 257}, { 80, 268}, { 84, 280}, { 88, 294}, + { 92, 307}, { 96, 321}, { 100, 334}, { 104, 350}, + { 109, 365}, { 114, 382}, { 119, 399}, { 124, 416}, + { 130, 434}, { 136, 454}, { 142, 475}, { 148, 495}, + { 155, 519}, { 162, 541}, { 169, 564}, { 176, 590}, + { 185, 617}, { 193, 644}, { 201, 673}, { 210, 703}, + { 220, 735}, { 230, 767}, { 240, 801}, { 251, 838}, + { 262, 876}, { 274, 914}, { 286, 955}, { 299, 997}, + { 312, 1041}, { 326, 1089}, { 341, 1138}, { 356, 1188}, + { 372, 1241}, { 388, 1297}, { 406, 1354}, { 424, 1415}, + { 443, 1478}, { 462, 1544}, { 483, 1613}, { 505, 1684}, + { 527, 1760}, { 551, 1838}, { 576, 1921}, { 601, 2007}, + { 628, 2097}, { 656, 2190}, { 686, 2288}, { 716, 2389}, + { 748, 2496}, { 781, 2607}, { 816, 2724}, { 853, 2846}, + { 891, 2973}, { 930, 3104}, { 972, 3243}, { 1016, 3389}, + { 1061, 3539}, { 1108, 3698}, { 1158, 3862}, { 1209, 4035}, + { 1264, 4216}, { 1320, 4403}, { 1379, 4599}, { 1441, 4806}, + { 1505, 5019}, { 1572, 5244}, { 1642, 5477}, { 1715, 5722}, + { 1792, 5978}, { 1872, 6245}, { 1955, 6522}, { 2043, 6813}, + { 2134, 7118}, { 2229, 7436}, { 2329, 7767}, { 2432, 8114}, + { 2541, 8477}, { 2655, 8854}, { 2773, 9250}, { 2897, 9663}, + { 3026, 10094}, { 3162, 10546}, { 3303, 11016}, { 3450, 11508}, + { 3604, 12020}, { 3765, 12556}, { 3933, 13118}, { 4108, 13703}, + { 4292, 14315}, { 4483, 14953}, { 4683, 15621}, { 4892, 16318}, + { 5111, 17046}, { 5339, 17807}, { 5577, 18602}, { 5826, 19433}, + { 6086, 20300}, { 6358, 21205}, { 6642, 22152}, { 6938, 23141}, + { 7248, 24173}, { 7571, 25252}, { 7909, 26380}, { 8262, 27557}, + { 8631, 28786}, { 9016, 30072}, { 9419, 31413}, { 9839, 32767}, + { 10278, 32767}, { 10737, 32767}, { 11216, 32767}, { 11717, 32767}, + { 12240, 32767}, { 12786, 32767}, { 13356, 32767}, { 13953, 32767}, + { 14576, 32767}, { 15226, 32767}, { 15906, 32767}, { 16615, 32767} +}; + +static const struct { + const int16_t *tab1; const int16_t *tab2; int stride; +} tabs[] = { + {MACEtab1, &MACEtab2[0][0], 4}, + {MACEtab3, &MACEtab4[0][0], 2}, + {MACEtab1, &MACEtab2[0][0], 4} }; static uint8_t CompactOutput(int16_t v) -{ - return ((v >> 8) & 0xff) ^ 0x80; -} - -/** - * MACE version of av_clip_int16(). We have to do this to keep binary - * identical output to the binary decoder. - */ -static inline int16_t mace_broken_clip_int16(int n) -{ - if (n > 32767) - return 32767; - else if (n < -32768) - return -32767; - else - return n; -} - -static int16_t read_table(MaceChannelDecState *chd, uint8_t val, int tab_idx) -{ - int16_t current; - - if (val < tabs[tab_idx].stride) - current = tabs[tab_idx].tab2[((chd->index & 0x7f0) >> 4) * tabs[tab_idx].stride + val]; - else - current = - 1 - tabs[tab_idx].tab2[((chd->index & 0x7f0) >> 4)*tabs[tab_idx].stride + 2*tabs[tab_idx].stride-val-1]; - - if (( chd->index += tabs[tab_idx].tab1[val]-(chd->index >> 5) ) < 0) - chd->index = 0; - - return current; -} - -static void chomp3(MaceChannelDecState *chd, uint8_t *output, uint8_t val, int tab_idx) -{ - - int16_t current = read_table(chd, val, tab_idx); - - current = mace_broken_clip_int16(current + chd->level); - - chd->level = current - (current >> 3); - *output = CompactOutput(current); -} - -static void chomp6(MaceChannelDecState *chd, uint8_t *output, uint8_t val, int tab_idx) -{ - int16_t current = read_table(chd, val, tab_idx); - - if ((chd->previous ^ current) >= 0) { - chd->factor = std::min(chd->factor + 506, 32767); - } else { - if (chd->factor - 314 < -32768) - chd->factor = -32767; - else - chd->factor -= 314; - } - - current = mace_broken_clip_int16(current + chd->level); - - chd->level = (current*chd->factor) >> 15; - current >>= 1; - - output[0] = CompactOutput(chd->previous + chd->prev2 - - ((chd->prev2-current) >> 2)); - output[1] = CompactOutput(chd->previous + current + - ((chd->prev2-current) >> 2)); - chd->prev2 = chd->previous; - chd->previous = current; +{ + return ((v >> 8) & 0xff) ^ 0x80; +} + +/** + * MACE version of av_clip_int16(). We have to do this to keep binary + * identical output to the binary decoder. + */ +static inline int16_t mace_broken_clip_int16(int n) +{ + if (n > 32767) + return 32767; + else if (n < -32768) + return -32767; + else + return n; +} + +static int16_t read_table(MaceChannelDecState *chd, uint8_t val, int tab_idx) +{ + int16_t current; + + if (val < tabs[tab_idx].stride) + current = tabs[tab_idx].tab2[((chd->index & 0x7f0) >> 4) * tabs[tab_idx].stride + val]; + else + current = - 1 - tabs[tab_idx].tab2[((chd->index & 0x7f0) >> 4)*tabs[tab_idx].stride + 2*tabs[tab_idx].stride-val-1]; + + if (( chd->index += tabs[tab_idx].tab1[val]-(chd->index >> 5) ) < 0) + chd->index = 0; + + return current; +} + +static void chomp3(MaceChannelDecState *chd, uint8_t *output, uint8_t val, int tab_idx) +{ + + int16_t current = read_table(chd, val, tab_idx); + + current = mace_broken_clip_int16(current + chd->level); + + chd->level = current - (current >> 3); + *output = CompactOutput(current); +} + +static void chomp6(MaceChannelDecState *chd, uint8_t *output, uint8_t val, int tab_idx) +{ + int16_t current = read_table(chd, val, tab_idx); + + if ((chd->previous ^ current) >= 0) { + chd->factor = std::min(chd->factor + 506, 32767); + } else { + if (chd->factor - 314 < -32768) + chd->factor = -32767; + else + chd->factor -= 314; + } + + current = mace_broken_clip_int16(current + chd->level); + + chd->level = (current*chd->factor) >> 15; + current >>= 1; + + output[0] = CompactOutput(chd->previous + chd->prev2 - + ((chd->prev2-current) >> 2)); + output[1] = CompactOutput(chd->previous + current + + ((chd->prev2-current) >> 2)); + chd->prev2 = chd->previous; + chd->previous = current; } void DecodeMACE3(MaceChannelDecState *chd, uint8_t pkt, uint8_t *output) -{ - uint8_t val[3] = { pkt & 7 , (pkt >> 3) & 3, pkt >> 5 }; - +{ + uint8_t val[3] = { pkt & 7 , (pkt >> 3) & 3, pkt >> 5 }; + for (int l = 0; l < 3; l++) - { - chomp3(chd, output, val[l], l); - output++; - } -} - -void DecodeMACE6(MaceChannelDecState *chd, uint8_t pkt, uint8_t *output) -{ - uint8_t val[3] = {pkt >> 5, (pkt >> 3) & 3, pkt & 7 }; - + { + chomp3(chd, output, val[l], l); + output++; + } +} + +void DecodeMACE6(MaceChannelDecState *chd, uint8_t pkt, uint8_t *output) +{ + uint8_t val[3] = {pkt >> 5, (pkt >> 3) & 3, pkt & 7 }; + for (int l = 0; l < 3; l++) - { + { chomp6(chd, output, val[l], l); - output += 2; - } -} + output += 2; + } +} From 567b82eb234b5a6ef843b8d8c7f989e80bea8baa Mon Sep 17 00:00:00 2001 From: elasota Date: Tue, 11 May 2021 21:36:12 -0400 Subject: [PATCH 7/9] Tag 1.1.0 rc2 --- GpCommon/GpBuildVersion.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GpCommon/GpBuildVersion.h b/GpCommon/GpBuildVersion.h index a13d700..1c0fa48 100644 --- a/GpCommon/GpBuildVersion.h +++ b/GpCommon/GpBuildVersion.h @@ -4,6 +4,6 @@ #define GP_BUILD_VERSION_MINOR 1 #define GP_BUILD_VERSION_UPDATE 0 -#define GP_APPLICATION_VERSION_STRING "1.1.0 rc1" +#define GP_APPLICATION_VERSION_STRING "1.1.0 Release Candidate 2" #define GP_APPLICATION_COPYRIGHT_STRING "2019-2021 Gale Force Games LLC" #define GP_APPLICATION_WEBSITE_STRING "https://github.com/elasota/Aerofoil" From 5b16ed826f6352d5e33900378551dc7fbacec129 Mon Sep 17 00:00:00 2001 From: elasota Date: Thu, 13 May 2021 12:13:45 -0400 Subject: [PATCH 8/9] Fix compile failure in debug --- PortabilityLayer/BinHex4.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PortabilityLayer/BinHex4.cpp b/PortabilityLayer/BinHex4.cpp index 3cf016e..ad40027 100644 --- a/PortabilityLayer/BinHex4.cpp +++ b/PortabilityLayer/BinHex4.cpp @@ -255,7 +255,7 @@ namespace PortabilityLayer } } - assert(decodedBytes.size() == decodedDataSize); + assert(decodedBytes.Count() == decodedDataSize); if (decodedBytes.Count() == 0) return nullptr; From b1bebc2afd6df421cbc6ae8d9c7104df5b9c55f9 Mon Sep 17 00:00:00 2001 From: elasota Date: Thu, 13 May 2021 12:14:18 -0400 Subject: [PATCH 9/9] Disable asserts in web release build --- AerofoilWeb/BuildAerofoilPortable.bat | 2 +- AerofoilWeb/BuildAerofoilSDL.bat | 6 +++++- AerofoilWeb/BuildAerofoilWeb.bat | 2 +- AerofoilWeb/BuildGpApp.bat | 6 +++++- AerofoilWeb/BuildGpShell.bat | 6 +++++- AerofoilWeb/BuildMacRomanConversion.bat | 6 +++++- AerofoilWeb/BuildPortabilityLayer.bat | 6 +++++- 7 files changed, 27 insertions(+), 7 deletions(-) diff --git a/AerofoilWeb/BuildAerofoilPortable.bat b/AerofoilWeb/BuildAerofoilPortable.bat index 6badad6..7b53c49 100644 --- a/AerofoilWeb/BuildAerofoilPortable.bat +++ b/AerofoilWeb/BuildAerofoilPortable.bat @@ -2,7 +2,7 @@ set INPUT_DIR=../AerofoilPortable set OUTPUT_DIR=obj rem set DEBUG_LEVEL_FLAGS=-g4 -O0 -set DEBUG_LEVEL_FLAGS=-O3 +set DEBUG_LEVEL_FLAGS=-O3 -DNDEBUG=1 set FLAGS=-s USE_SDL=2 -flto -I../GpCommon/ -I../Common/ -s ASYNCIFY %DEBUG_LEVEL_FLAGS% -DGP_DEBUG_CONFIG=0 diff --git a/AerofoilWeb/BuildAerofoilSDL.bat b/AerofoilWeb/BuildAerofoilSDL.bat index 580b599..30caead 100644 --- a/AerofoilWeb/BuildAerofoilSDL.bat +++ b/AerofoilWeb/BuildAerofoilSDL.bat @@ -1,6 +1,10 @@ set INPUT_DIR=../AerofoilSDL set OUTPUT_DIR=obj -set FLAGS=-s USE_SDL=2 -flto -I../GpCommon/ -I../PortabilityLayer/ -I../Common/ -s ASYNCIFY -O3 -DGP_DEBUG_CONFIG=0 + +rem set DEBUG_LEVEL_FLAGS=-g4 -O0 +set DEBUG_LEVEL_FLAGS=-O3 -DNDEBUG=1 + +set FLAGS=-s USE_SDL=2 -flto -I../GpCommon/ -I../PortabilityLayer/ -I../Common/ -s ASYNCIFY %DEBUG_LEVEL_FLAGS% -DGP_DEBUG_CONFIG=0 emcc -c %INPUT_DIR%/AerofoilSDL_Combined.cpp -o %OUTPUT_DIR%/AerofoilSDL_Combined.o %FLAGS% diff --git a/AerofoilWeb/BuildAerofoilWeb.bat b/AerofoilWeb/BuildAerofoilWeb.bat index f072b72..b3812f6 100644 --- a/AerofoilWeb/BuildAerofoilWeb.bat +++ b/AerofoilWeb/BuildAerofoilWeb.bat @@ -2,7 +2,7 @@ set INPUT_DIR=. set OUTPUT_DIR=obj rem set DEBUG_LEVEL_FLAGS=-g4 -O0 -set DEBUG_LEVEL_FLAGS=-O3 +set DEBUG_LEVEL_FLAGS=-O3 -DNDEBUG=1 set FLAGS=-s USE_SDL=2 -flto -I../GpCommon/ -I../PortabilityLayer/ -I../Common/ -I../AerofoilPortable/ -I../GpShell/ -s ASYNCIFY %DEBUG_LEVEL_FLAGS% -DGP_DEBUG_CONFIG=0 diff --git a/AerofoilWeb/BuildGpApp.bat b/AerofoilWeb/BuildGpApp.bat index 5eb22b3..40b25d8 100644 --- a/AerofoilWeb/BuildGpApp.bat +++ b/AerofoilWeb/BuildGpApp.bat @@ -1,6 +1,10 @@ set INPUT_DIR=../GpApp set OUTPUT_DIR=obj -set FLAGS=-s USE_SDL=2 -flto -I../GpCommon/ -I../PortabilityLayer/ -I../Common/ -s ASYNCIFY -O3 -DGP_DEBUG_CONFIG=0 + +rem set DEBUG_LEVEL_FLAGS=-g4 -O0 +set DEBUG_LEVEL_FLAGS=-O3 -DNDEBUG=1 + +set FLAGS=-s USE_SDL=2 -flto -I../GpCommon/ -I../PortabilityLayer/ -I../Common/ -s ASYNCIFY %DEBUG_LEVEL_FLAGS% -DGP_DEBUG_CONFIG=0 emcc -c %INPUT_DIR%/GpApp_Combined.cpp -o %OUTPUT_DIR%/GpApp_Combined.o %FLAGS% diff --git a/AerofoilWeb/BuildGpShell.bat b/AerofoilWeb/BuildGpShell.bat index d055597..25983da 100644 --- a/AerofoilWeb/BuildGpShell.bat +++ b/AerofoilWeb/BuildGpShell.bat @@ -1,6 +1,10 @@ set INPUT_DIR=../GpShell set OUTPUT_DIR=obj -set FLAGS=-s USE_SDL=2 -flto -I../GpCommon/ -I../PortabilityLayer/ -I../Common/ -s ASYNCIFY -O3 -DGP_DEBUG_CONFIG=0 + +rem set DEBUG_LEVEL_FLAGS=-g4 -O0 +set DEBUG_LEVEL_FLAGS=-O3 -DNDEBUG=1 + +set FLAGS=-s USE_SDL=2 -flto -I../GpCommon/ -I../PortabilityLayer/ -I../Common/ -s ASYNCIFY %DEBUG_LEVEL_FLAGS% -DGP_DEBUG_CONFIG=0 emcc -c %INPUT_DIR%/GpShell_Combined.cpp -o %OUTPUT_DIR%/GpShell_Combined.o %FLAGS% diff --git a/AerofoilWeb/BuildMacRomanConversion.bat b/AerofoilWeb/BuildMacRomanConversion.bat index 3755fdf..3c169d4 100644 --- a/AerofoilWeb/BuildMacRomanConversion.bat +++ b/AerofoilWeb/BuildMacRomanConversion.bat @@ -1,6 +1,10 @@ set INPUT_DIR=../MacRomanConversion set OUTPUT_DIR=obj -set FLAGS=-flto -I../MacRomanConversion/ -s ASYNCIFY -O3 + +rem set DEBUG_LEVEL_FLAGS=-g4 -O0 +set DEBUG_LEVEL_FLAGS=-O3 -DNDEBUG=1 + +set FLAGS=-flto -I../MacRomanConversion/ -s ASYNCIFY %DEBUG_LEVEL_FLAGS% emcc -c %INPUT_DIR%/MacRomanConversion.cpp -o %OUTPUT_DIR%/MacRomanConversion.o %FLAGS% diff --git a/AerofoilWeb/BuildPortabilityLayer.bat b/AerofoilWeb/BuildPortabilityLayer.bat index 11e26b9..cd246ca 100644 --- a/AerofoilWeb/BuildPortabilityLayer.bat +++ b/AerofoilWeb/BuildPortabilityLayer.bat @@ -1,6 +1,10 @@ set INPUT_DIR=../PortabilityLayer set OUTPUT_DIR=obj -set FLAGS=-s USE_ZLIB=1 -flto -I../GpCommon/ -I../Common/ -I../PortabilityLayer/ -I../rapidjson/include/ -I../MacRomanConversion/ -I../stb/ -s ASYNCIFY -O3 -DGP_DEBUG_CONFIG=0 -Wno-tautological-constant-out-of-range-compare + +rem set DEBUG_LEVEL_FLAGS=-g4 -O0 +set DEBUG_LEVEL_FLAGS=-O3 -DNDEBUG=1 + +set FLAGS=-s USE_ZLIB=1 -flto -I../GpCommon/ -I../Common/ -I../PortabilityLayer/ -I../rapidjson/include/ -I../MacRomanConversion/ -I../stb/ -s ASYNCIFY %DEBUG_LEVEL_FLAGS% -DGP_DEBUG_CONFIG=0 -Wno-tautological-constant-out-of-range-compare emcc -c %INPUT_DIR%/PortabilityLayer_Combined.cpp -o %OUTPUT_DIR%/PortabilityLayer_Combined.o %FLAGS%