diff --git a/Assets/dll/octoshock.dll b/Assets/dll/octoshock.dll index eee804cf04..e02d50f61f 100644 Binary files a/Assets/dll/octoshock.dll and b/Assets/dll/octoshock.dll differ diff --git a/psx/octoshock/bizhawk/octoshock.vcxproj b/psx/octoshock/bizhawk/octoshock.vcxproj index 1c438de3c4..1a9ad75f5c 100644 --- a/psx/octoshock/bizhawk/octoshock.vcxproj +++ b/psx/octoshock/bizhawk/octoshock.vcxproj @@ -78,6 +78,7 @@ copy /Y "$(TargetDir)$(TargetName).dll" "$(SolutionDir)..\..\..\output\dll\$(Tar + diff --git a/psx/octoshock/error.cpp b/psx/octoshock/error.cpp new file mode 100644 index 0000000000..d299584b37 --- /dev/null +++ b/psx/octoshock/error.cpp @@ -0,0 +1,144 @@ +/******************************************************************************/ +/* Mednafen - Multi-system Emulator */ +/******************************************************************************/ +/* error.cpp: +** Copyright (C) 2007-2016 Mednafen Team +** +** This program is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License +** as published by the Free Software Foundation; either version 2 +** of the License, or (at your option) any later version. +** +** This program 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 General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software Foundation, Inc., +** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include "error.h" +#include +#include +#include + +MDFN_Error::MDFN_Error() noexcept +{ + abort(); +} + +MDFN_Error::MDFN_Error(int errno_code_new, const char *format, ...) noexcept +{ + errno_code = errno_code_new; + + va_list ap; + va_start(ap, format); + va_list ap_copy; + va_copy(ap_copy, ap); + std::vector buf(1+vsnprintf(nullptr, 0, format, ap)); + va_end(ap); + (void)vsnprintf(buf.data(), buf.size(),format, ap_copy); + va_end(ap_copy); + error_message = strdup(buf.data()); + va_end(ap); +} + + +MDFN_Error::MDFN_Error(const ErrnoHolder &enh) +{ + errno_code = enh.Errno(); + + error_message = strdup(enh.StrError()); +} + + +MDFN_Error::~MDFN_Error() noexcept +{ + if(error_message) + { + free(error_message); + error_message = NULL; + } +} + +MDFN_Error::MDFN_Error(const MDFN_Error &ze_error) noexcept +{ + if(ze_error.error_message) + error_message = strdup(ze_error.error_message); + else + error_message = NULL; + + errno_code = ze_error.errno_code; +} + +MDFN_Error& MDFN_Error::operator=(const MDFN_Error &ze_error) noexcept +{ + char *new_error_message = ze_error.error_message ? strdup(ze_error.error_message) : NULL; + int new_errno_code = ze_error.errno_code; + + if(error_message) + free(error_message); + + error_message = new_error_message; + errno_code = new_errno_code; + + return(*this); +} + + +const char * MDFN_Error::what(void) const noexcept +{ + if(!error_message) + return("Error allocating memory for the error message!"); + + return(error_message); +} + +int MDFN_Error::GetErrno(void) const noexcept +{ + return(errno_code); +} + +static MDFN_NOWARN_UNUSED const char *srr_wrap(int ret, const char *local_strerror) +{ + if(ret == -1) + return("ERROR IN strerror_r()!!!"); + + return(local_strerror); +} + +static MDFN_NOWARN_UNUSED const char *srr_wrap(const char *ret, const char *local_strerror) +{ + if(ret == NULL) + return("ERROR IN strerror_r()!!!"); + + return(ret); +} + +void ErrnoHolder::SetErrno(int the_errno) +{ + local_errno = the_errno; + + if(the_errno == 0) + local_strerror[0] = 0; + else + { + #ifdef HAVE_STRERROR_R + const char *retv; + + retv = srr_wrap(strerror_r(the_errno, local_strerror, 256), local_strerror); + + if(retv != local_strerror) + strncpy(local_strerror, retv, 255); + + #else // No strerror_r :( + + strncpy(local_strerror, strerror(the_errno), 255); + + #endif + + local_strerror[255] = 0; + } +} diff --git a/psx/octoshock/error.h b/psx/octoshock/error.h index 9fba0c198e..0fcb68d3ed 100644 --- a/psx/octoshock/error.h +++ b/psx/octoshock/error.h @@ -4,6 +4,7 @@ #include #include #include +#include "emuware/emuware.h" #ifdef __cplusplus @@ -22,7 +23,7 @@ class MDFN_Error : public std::exception MDFN_Error(const MDFN_Error &ze_error) noexcept; MDFN_Error & operator=(const MDFN_Error &ze_error) noexcept; -// virtual const char *what(void) const noexcept; + virtual const char *what(void) const noexcept; int GetErrno(void) const noexcept; private: diff --git a/psx/octoshock/psx/psx.cpp b/psx/octoshock/psx/psx.cpp index 7c7140a8f1..e7ab6b2f3f 100644 --- a/psx/octoshock/psx/psx.cpp +++ b/psx/octoshock/psx/psx.cpp @@ -1919,9 +1919,8 @@ static MDFN_COLD void LoadEXE(const uint8 *data, const uint32 size, bool ignore_ uint32 TextStart; uint32 TextSize; - //TODO ERROR HANDLING - //if(size < 0x800) - // throw(MDFN_Error(0, "PS-EXE is too small.")); + if(size < 0x800) + throw(MDFN_Error(0, "PS-EXE is too small.")); PC = MDFN_de32lsb(&data[0x10]); SP = MDFN_de32lsb(&data[0x30]); @@ -1937,16 +1936,14 @@ static MDFN_COLD void LoadEXE(const uint8 *data, const uint32 size, bool ignore_ if(TextSize > 2048 * 1024) { - //TODO ERROR HANDLING - //throw(MDFN_Error(0, "Text section too large")); + throw(MDFN_Error(0, "Text section too large")); } - //TODO ERROR HANDLING - /*if(TextSize > (size - 0x800)) + if(TextSize > (size - 0x800)) throw(MDFN_Error(0, "Text section recorded size is larger than data available in file. Header=0x%08x, Available=0x%08x", TextSize, size - 0x800)); if(TextSize < (size - 0x800)) - throw(MDFN_Error(0, "Text section recorded size is smaller than data available in file. Header=0x%08x, Available=0x%08x", TextSize, size - 0x800));*/ + throw(MDFN_Error(0, "Text section recorded size is smaller than data available in file. Header=0x%08x, Available=0x%08x", TextSize, size - 0x800)); if(!TextMem.size()) { @@ -2862,4 +2859,4 @@ EW_EXPORT s32 shock_PokeMemory(void* psx, u32 address, u8 value) CPU->PokeMem8(address, value); return SHOCK_OK; -} \ No newline at end of file +}