void patchHelper(const wxString& cmd, const wxString& param) { // Error Handling Note: I just throw simple wxStrings here, and then catch them below and // format them into more detailed cmd+data+error printouts. If we want to add user-friendly // (translated) messages for display in a popup window then we'll have to upgrade the // exception a little bit. // print the actual patch lines only in verbose mode (even in devel) if (DevConWriterEnabled) DevCon.WriteLn(cmd + L" " + param); try { if (isCheat && cheatnumber >= MAX_CHEAT) throw wxString( L"Maximum number of cheats reached" ); if(!isCheat && patchnumber >= MAX_PATCH) throw wxString( L"Maximum number of patches reached" ); IniPatch& iPatch = isCheat ? Cheat[cheatnumber] : Patch[patchnumber]; PatchPieces pieces(param); iPatch.enabled = 0; iPatch.placetopatch = StrToU32(pieces.PlaceToPatch(), 10); iPatch.cpu = (patch_cpu_type)PatchTableExecute(pieces.CpuType(), cpuCore); iPatch.addr = StrToU32(pieces.MemAddr(), 16); iPatch.type = (patch_data_type)PatchTableExecute(pieces.OperandSize(), dataType); iPatch.data = StrToU64(pieces.WriteValue(), 16); if (iPatch.cpu == 0) throw wxsFormat(L"Unrecognized CPU Target: '%s'", WX_STR(pieces.CpuType())); if (iPatch.type == 0) throw wxsFormat(L"Unrecognized Operand Size: '%s'", WX_STR(pieces.OperandSize())); iPatch.enabled = 1; // omg success!! if (isCheat) cheatnumber++; else patchnumber++; } catch( wxString& exmsg ) { Console.Error(L"(Patch) Error Parsing: %s=%s", WX_STR(cmd), WX_STR(param)); Console.Indent().Error( exmsg ); } }
static void CheckForRegisterChange( HWND hwnd ) { RegModifyData *data; mad_type_info mti_target; mad_type_info mti_host; int size; char *s; char *endptr; void *test; addr_seg seg; InputUnion in; data = ( RegModifyData * )GetWindowLong( hwnd, DWL_USER ); MADTypeInfo( data->curr_info->type, &mti_target ); if( data->num_possible == 1 ) { size = SendDlgItemMessage( hwnd, REG_EDIT_FIELD, WM_GETTEXTLENGTH, 0, 0 ) + 1 ; s = alloca( size ); GetDlgItemText( hwnd, REG_EDIT_FIELD, s, 255 ); test = alloca( mti_target.b.bits / BITS_PER_BYTE ); memset( &seg, 0, sizeof( seg ) ); errno = 0; size = 0; switch ( mti_target.b.kind ) { case MTK_INTEGER: if( !StrToU64( s, &( in.i ), ( mti_target.i.nr != MNR_UNSIGNED ) ) ) { MessageBox( hwnd, "Unrecognized input.", "Error",MB_OK | MB_ICONEXCLAMATION ) ; return; } size = sizeof( unsigned_64 ); break; case MTK_FLOAT: in.d = strtod( s, &endptr ); if( errno == ERANGE ) { MessageBox( hwnd, "Value out of range.", "Error",MB_OK | MB_ICONEXCLAMATION ) ; return; } if( *endptr != '\0' ) { MessageBox( hwnd, "Unrecognized input.", "Error",MB_OK | MB_ICONEXCLAMATION ) ; return; } size = sizeof( in.d ); break; default: EndDialog( hwnd, 0 ); break; } MADTypeInfoForHost( mti_target.b.kind, size, &mti_host ); MADTypeConvert( &mti_host, &in, &mti_target, test, seg ); if( memcmp( data->curr_value, test, mti_target.b.bits / BITS_PER_BYTE ) == 0 ) { EndDialog( hwnd, 0 ); } else { memcpy( data->curr_value, test, mti_target.b.bits / BITS_PER_BYTE ); EndDialog( hwnd, 1 ); } } else { int i = (int)SendDlgItemMessage( hwnd, CH_REG_COMBO_LIST, CB_GETCURSEL, 0, 0L ); if( memcmp( data->curr_value, data->m_list[i].data, mti_target.b.bits / BITS_PER_BYTE ) == 0 ) { EndDialog( hwnd, 0 ); } else { memcpy( data->curr_value, data->m_list[i].data, mti_target.b.bits / BITS_PER_BYTE ); EndDialog( hwnd, 1 ); } } }