From: <sag...@us...> - 2011-09-18 20:11:39
|
Revision: 1040 http://modplug.svn.sourceforge.net/modplug/?rev=1040&view=rev Author: saga-games Date: 2011-09-18 20:11:32 +0000 (Sun, 18 Sep 2011) Log Message: ----------- [Ref/Fix] Fixing more "new MODINSTRUMENT" stuff (exception handling). Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/soundlib/LOAD_DBM.CPP trunk/OpenMPT/soundlib/Load_ams.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_mdl.cpp trunk/OpenMPT/soundlib/Load_mt2.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/Sampleio.cpp trunk/OpenMPT/soundlib/load_j2b.cpp Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2011-09-18 19:38:13 UTC (rev 1039) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2011-09-18 20:11:32 UTC (rev 1040) @@ -111,7 +111,13 @@ CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); if(m_nInstrument > 0 && pSndFile && m_nInstrument <= pSndFile->GetNumInstruments() && pSndFile->Instruments[m_nInstrument] == nullptr) { - pSndFile->Instruments[m_nInstrument] = new MODINSTRUMENT(); + try + { + pSndFile->Instruments[m_nInstrument] = new MODINSTRUMENT(); + } catch(MPTMemoryException) + { + return FALSE; + } m_pModDoc->InitializeInstrument(pSndFile->Instruments[m_nInstrument]); } Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2011-09-18 19:38:13 UTC (rev 1039) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2011-09-18 20:11:32 UTC (rev 1040) @@ -735,9 +735,14 @@ if ((!m_SndFile.m_nInstruments) && (m_SndFile.m_nType & MOD_TYPE_XM)) { - m_SndFile.m_nInstruments = 1; - m_SndFile.Instruments[1] = new MODINSTRUMENT(1); - InitializeInstrument(m_SndFile.Instruments[1]); + try + { + m_SndFile.Instruments[1] = new MODINSTRUMENT(1); + m_SndFile.m_nInstruments = 1; + InitializeInstrument(m_SndFile.Instruments[1]); + } catch(MPTMemoryException) + { + } } if (m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT|MOD_TYPE_XM)) { Modified: trunk/OpenMPT/soundlib/LOAD_DBM.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2011-09-18 19:38:13 UTC (rev 1039) +++ trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2011-09-18 20:11:32 UTC (rev 1040) @@ -236,7 +236,14 @@ nsmp = BigEndianW(pih->sampleno); psmp = ((nsmp) && (nsmp < MAX_SAMPLES)) ? &Samples[nsmp] : nullptr; - if ((pIns = new MODINSTRUMENT(nsmp)) == nullptr) break; + try + { + pIns = new MODINSTRUMENT(nsmp); + } catch(MPTMemoryException) + { + break; + } + Instruments[iIns + 1] = pIns; memcpy(pIns->name, pih->name, 30); Modified: trunk/OpenMPT/soundlib/Load_ams.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_ams.cpp 2011-09-18 19:38:13 UTC (rev 1039) +++ trunk/OpenMPT/soundlib/Load_ams.cpp 2011-09-18 20:11:32 UTC (rev 1040) @@ -395,9 +395,16 @@ dwMemPos += 5 + panenv->points*3; pitchenv = (AMS2ENVELOPE *)(lpStream+dwMemPos); dwMemPos += 5 + pitchenv->points*3; - MODINSTRUMENT *pIns = new MODINSTRUMENT(); - if (!pIns) return TRUE; - memset(smpmap, 0, sizeof(smpmap)); + MODINSTRUMENT *pIns; + try + { + pIns = new MODINSTRUMENT(); + } catch(MPTMemoryException) + { + return true; + } + + MemsetZero(smpmap); for (UINT ismpmap=0; ismpmap<pSmp->samples; ismpmap++) { Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2011-09-18 19:38:13 UTC (rev 1039) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2011-09-18 20:11:32 UTC (rev 1040) @@ -491,14 +491,6 @@ vector<DWORD> inspos; vector<DWORD> smppos; vector<DWORD> patpos; -// Using eric's code here to take care of NNAs etc.. -// -> CODE#0006 -// -> DESC="misc quantity changes" -// BYTE chnmask[64], channels_used[64]; -// MODCOMMAND lastvalue[64]; - BYTE chnmask[MAX_BASECHANNELS]; - MODCOMMAND lastvalue[MAX_BASECHANNELS]; -// -! BEHAVIOUR_CHANGE#0006 bool interpretModPlugMade = false; bool hasModPlugExtensions = false; @@ -880,8 +872,6 @@ // Checking for unused channels for (UINT patchk=0; patchk<npatterns; patchk++) { - memset(chnmask, 0, sizeof(chnmask)); - if ((!patpos[patchk]) || ((DWORD)patpos[patchk] >= dwMemLength - 4)) continue; @@ -904,6 +894,8 @@ const BYTE *p = lpStream+patpos[patchk]+8; UINT nrow = 0; + vector<BYTE> chnmask; + while (nrow<rows) { if (i >= len) break; @@ -918,6 +910,11 @@ if (ch) ch = (ch - 1);// & IT_bitmask_patternChanMask_c; // 0x3f mask of the byte again, keeping only 6 bits + if(ch >= chnmask.size()) + { + chnmask.resize(ch + 1, 0); + } + if (b & IT_bitmask_patternChanEnabled_c) // 0x80 check if the upper bit is enabled. { if (i >= len) @@ -955,10 +952,14 @@ { if ((inspos[nins] > 0) && (inspos[nins] < dwMemLength - (pifh->cmwt < 0x200 ? sizeof(ITOLDINSTRUMENT) : sizeof(ITINSTRUMENT)))) { - MODINSTRUMENT *pIns = new MODINSTRUMENT(); - if (!pIns) continue; - Instruments[nins + 1] = pIns; - ITInstrToMPT(lpStream + inspos[nins], pIns, pifh->cmwt); + try + { + Instruments[nins + 1] = new MODINSTRUMENT(); + ITInstrToMPT(lpStream + inspos[nins], Instruments[nins + 1], pifh->cmwt); + } catch(MPTMemoryException) + { + continue; + } } } @@ -1098,8 +1099,9 @@ // Now (after the Insert() call), we can read the pattern name. CopyPatternName(Patterns[npat], &patNames, patNamesLen); - memset(lastvalue, 0, sizeof(lastvalue)); - memset(chnmask, 0, sizeof(chnmask)); + vector<BYTE> chnmask; + vector<MODCOMMAND> lastvalue; + MODCOMMAND *m = Patterns[npat]; UINT i = 0; const BYTE *p = lpStream+patpos[npat]+8; @@ -1120,6 +1122,13 @@ if (ch) ch = (ch - 1); //& IT_bitmask_patternChanMask_c; // 0x3f + if(ch >= chnmask.size()) + { + chnmask.resize(ch + 1, 0); + lastvalue.resize(ch + 1, MODCOMMAND::Empty()); + ASSERT(chnmask.size() <= GetNumChannels()); + } + if (b & IT_bitmask_patternChanEnabled_c) // 0x80 { if (i >= len) @@ -2474,7 +2483,7 @@ if (nInstruments == 0) return; - MODINSTRUMENT *sizeIns = new MODINSTRUMENT(); + MODINSTRUMENT *sizeIns = nullptr; WriteInstrumentPropertyForAllInstruments('VR..', sizeof(sizeIns->nVolRampUp), f, nInstruments); WriteInstrumentPropertyForAllInstruments('MiP.', sizeof(sizeIns->nMixPlug), f, nInstruments); @@ -2521,8 +2530,6 @@ } } - delete sizeIns; - return; } Modified: trunk/OpenMPT/soundlib/Load_mdl.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mdl.cpp 2011-09-18 19:38:13 UTC (rev 1039) +++ trunk/OpenMPT/soundlib/Load_mdl.cpp 2011-09-18 20:11:32 UTC (rev 1040) @@ -370,7 +370,13 @@ if (!Instruments[nins]) { UINT note = 12; - if ((Instruments[nins] = new MODINSTRUMENT()) == nullptr) break; + try + { + Instruments[nins] = new MODINSTRUMENT(); + } catch(MPTMemoryException) + { + break; + } MODINSTRUMENT *pIns = Instruments[nins]; memcpy(pIns->name, lpStream+dwPos+2, 32); StringFixer::SpaceToNullStringFixed<31>(pIns->name); @@ -417,7 +423,13 @@ } for (j=1; j<=m_nInstruments; j++) if (!Instruments[j]) { - Instruments[j] = new MODINSTRUMENT(); + try + { + Instruments[j] = new MODINSTRUMENT(); + } catch(MPTMemoryException) + { + } + } break; // VE: Volume Envelope Modified: trunk/OpenMPT/soundlib/Load_mt2.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mt2.cpp 2011-09-18 19:38:13 UTC (rev 1039) +++ trunk/OpenMPT/soundlib/Load_mt2.cpp 2011-09-18 20:11:32 UTC (rev 1040) @@ -401,12 +401,14 @@ MODINSTRUMENT *pIns = NULL; if (iIns <= m_nInstruments) { - pIns = new MODINSTRUMENT(); - Instruments[iIns] = pIns; - if (pIns) + try { + pIns = new MODINSTRUMENT(); + Instruments[iIns] = pIns; memcpy(pIns->name, pmi->szName, 32); StringFixer::SpaceToNullStringFixed<31>(pIns->name); + } catch(MPTMemoryException) + { } } #ifdef MT2DEBUG Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2011-09-18 19:38:13 UTC (rev 1039) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2011-09-18 20:11:32 UTC (rev 1040) @@ -284,7 +284,7 @@ if(xmheader.flags & 1) m_dwSongFlags |= SONG_LINEARSLIDES; if(xmheader.flags & 0x1000) m_dwSongFlags |= SONG_EXFILTERRANGE; - Order.ReadAsByte(lpStream + 80, xmheader.orders, dwMemLength - 80); + Order.ReadAsByte(lpStream + 80, min(xmheader.orders, MAX_ORDERS), dwMemLength - 80); dwMemPos = xmheader.size + 60; @@ -317,7 +317,13 @@ MemsetZero(pih); memcpy(&pih, lpStream + dwMemPos, min(sizeof(pih), ihsize)); - if ((Instruments[iIns] = new MODINSTRUMENT()) == nullptr) continue; + try + { + Instruments[iIns] = new MODINSTRUMENT(); + } catch(MPTMemoryException) + { + continue; + } memcpy(Instruments[iIns]->name, pih.name, 22); StringFixer::SpaceToNullStringFixed<22>(Instruments[iIns]->name); @@ -485,7 +491,6 @@ } for (UINT j=0; j<96; j++) { - pIns->NoteMap[j+12] = j+1+12; if (xmsh.snum[j] < nsamples) pIns->Keyboard[j+12] = samplemap[xmsh.snum[j]]; } Modified: trunk/OpenMPT/soundlib/Sampleio.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sampleio.cpp 2011-09-18 19:38:13 UTC (rev 1039) +++ trunk/OpenMPT/soundlib/Sampleio.cpp 2011-09-18 20:11:32 UTC (rev 1040) @@ -78,11 +78,17 @@ } } - MODINSTRUMENT *pIns = new MODINSTRUMENT(nSample); - if (!pIns) return false; + MODINSTRUMENT *pIns; + try + { + pIns = new MODINSTRUMENT(nSample); + } catch(MPTMemoryException) + { + return false; + } + DestroyInstrument(nInstr, deleteAssociatedSamples); - Instruments[nInstr] = pIns; // Default values @@ -188,59 +194,67 @@ || (nInstr >= MAX_INSTRUMENTS) || (!pSrcSong->Instruments[nSrcInstr])) return false; if (m_nInstruments < nInstr) m_nInstruments = nInstr; + MODINSTRUMENT *pIns; + + try + { + pIns = new MODINSTRUMENT(); + } catch(MPTMemoryException) + { + return false; + } + DestroyInstrument(nInstr, deleteAssociatedSamples); - if (!Instruments[nInstr]) Instruments[nInstr] = new MODINSTRUMENT(); - MODINSTRUMENT *pIns = Instruments[nInstr]; - if (pIns) + Instruments[nInstr] = pIns; + + // TODO we want to copy ALL samples, not just 32! Use vectors here. + WORD samplemap[32]; + WORD samplesrc[32]; + UINT nSamples = 0; + UINT nsmp = 1; + *pIns = *pSrcSong->Instruments[nSrcInstr]; + for (UINT i=0; i<128; i++) { - WORD samplemap[32]; - WORD samplesrc[32]; - UINT nSamples = 0; - UINT nsmp = 1; - *pIns = *pSrcSong->Instruments[nSrcInstr]; - for (UINT i=0; i<128; i++) + UINT n = pIns->Keyboard[i]; + if ((n) && (n <= pSrcSong->m_nSamples) && (i < NOTE_MAX)) { - UINT n = pIns->Keyboard[i]; - if ((n) && (n <= pSrcSong->m_nSamples) && (i < NOTE_MAX)) + UINT j = 0; + for (j=0; j<nSamples; j++) { - UINT j = 0; - for (j=0; j<nSamples; j++) + if (samplesrc[j] == n) break; + } + if (j >= nSamples) + { + while ((nsmp < MAX_SAMPLES) && ((Samples[nsmp].pSample) || (m_szNames[nsmp][0]))) nsmp++; + if ((nSamples < 32) && (nsmp < MAX_SAMPLES)) { - if (samplesrc[j] == n) break; - } - if (j >= nSamples) - { - while ((nsmp < MAX_SAMPLES) && ((Samples[nsmp].pSample) || (m_szNames[nsmp][0]))) nsmp++; - if ((nSamples < 32) && (nsmp < MAX_SAMPLES)) - { - samplesrc[nSamples] = (WORD)n; - samplemap[nSamples] = (WORD)nsmp; - nSamples++; - pIns->Keyboard[i] = (WORD)nsmp; - if (m_nSamples < nsmp) m_nSamples = nsmp; - nsmp++; - } else - { - pIns->Keyboard[i] = 0; - } + samplesrc[nSamples] = (WORD)n; + samplemap[nSamples] = (WORD)nsmp; + nSamples++; + pIns->Keyboard[i] = (SAMPLEINDEX)nsmp; + if (m_nSamples < nsmp) m_nSamples = nsmp; + nsmp++; } else { - pIns->Keyboard[i] = samplemap[j]; + pIns->Keyboard[i] = 0; } } else { - pIns->Keyboard[i] = 0; + pIns->Keyboard[i] = samplemap[j]; } - } - // Load Samples - for (UINT k=0; k<nSamples; k++) + } else { - ReadSampleFromSong(samplemap[k], pSrcSong, samplesrc[k]); + pIns->Keyboard[i] = 0; } - return true; } - return false; + // Load Samples + for (UINT k=0; k<nSamples; k++) + { + ReadSampleFromSong(samplemap[k], pSrcSong, samplesrc[k]); + } + + return true; } @@ -866,11 +880,16 @@ || (!pih->layers) || (!plh->samples)) return false; if (nInstr > m_nInstruments) m_nInstruments = nInstr; + try + { + pIns = new MODINSTRUMENT(); + } catch(MPTMemoryException) + { + return false; + } + DestroyInstrument(nInstr, deleteAssociatedSamples); - pIns = new MODINSTRUMENT(); - if (!pIns) return false; - Instruments[nInstr] = pIns; nSamples = plh->samples; if (nSamples > 16) nSamples = 16; @@ -1081,12 +1100,19 @@ if ((dwMemPos < sizeof(XIFILEHEADER)) || (dwMemPos >= dwFileLength)) return false; if (nInstr > m_nInstruments) m_nInstruments = nInstr; - DestroyInstrument(nInstr, deleteAssociatedSamples); + MODINSTRUMENT *pIns; - Instruments[nInstr] = new MODINSTRUMENT(); - MODINSTRUMENT *pIns = Instruments[nInstr]; - if (!pIns) return false; + try + { + pIns = new MODINSTRUMENT(); + } catch(MPTMemoryException) + { + return false; + } + DestroyInstrument(nInstr, deleteAssociatedSamples); + + Instruments[nInstr] = pIns; memcpy(pIns->name, pxh->name, 22); nsamples = 0; for (UINT i=0; i<96; i++) @@ -1149,17 +1175,17 @@ pIns->PanEnv.Values[ienv] = (BYTE)pih->pIns[ienv*2+1]; if (ienv) { - if (pIns->VolEnv.Ticks[ienv] < pIns->VolEnv.Ticks[ienv-1]) + if (pIns->VolEnv.Ticks[ienv] < pIns->VolEnv.Ticks[ienv - 1]) { pIns->VolEnv.Ticks[ienv] &= 0xFF; - pIns->VolEnv.Ticks[ienv] += pIns->VolEnv.Ticks[ienv-1] & 0xFF00; - if (pIns->VolEnv.Ticks[ienv] < pIns->VolEnv.Ticks[ienv-1]) pIns->VolEnv.Ticks[ienv] += 0x100; + pIns->VolEnv.Ticks[ienv] += pIns->VolEnv.Ticks[ienv - 1] & 0xFF00; + if (pIns->VolEnv.Ticks[ienv] < pIns->VolEnv.Ticks[ienv - 1]) pIns->VolEnv.Ticks[ienv] += 0x100; } - if (pIns->PanEnv.Ticks[ienv] < pIns->PanEnv.Ticks[ienv-1]) + if (pIns->PanEnv.Ticks[ienv] < pIns->PanEnv.Ticks[ienv - 1]) { pIns->PanEnv.Ticks[ienv] &= 0xFF; - pIns->PanEnv.Ticks[ienv] += pIns->PanEnv.Ticks[ienv-1] & 0xFF00; - if (pIns->PanEnv.Ticks[ienv] < pIns->PanEnv.Ticks[ienv-1]) pIns->PanEnv.Ticks[ienv] += 0x100; + pIns->PanEnv.Ticks[ienv] += pIns->PanEnv.Ticks[ienv - 1] & 0xFF00; + if (pIns->PanEnv.Ticks[ienv] < pIns->PanEnv.Ticks[ienv - 1]) pIns->PanEnv.Ticks[ienv] += 0x100; } } } @@ -1690,12 +1716,19 @@ || (pinstr->id != LittleEndian(IT_IMPI))) return false; if (nInstr > m_nInstruments) m_nInstruments = nInstr; + MODINSTRUMENT *pIns; + + try + { + pIns = new MODINSTRUMENT(); + } catch(MPTMemoryException) + { + return false; + } + DestroyInstrument(nInstr, deleteAssociatedSamples); - Instruments[nInstr] = new MODINSTRUMENT(); - MODINSTRUMENT *pIns = Instruments[nInstr]; - if (!pIns) return false; - + Instruments[nInstr] = pIns; MemsetZero(samplemap); dwMemPos = 554; dwMemPos += ITInstrToMPT(pinstr, pIns, pinstr->trkvers); Modified: trunk/OpenMPT/soundlib/load_j2b.cpp =================================================================== --- trunk/OpenMPT/soundlib/load_j2b.cpp 2011-09-18 19:38:13 UTC (rev 1039) +++ trunk/OpenMPT/soundlib/load_j2b.cpp 2011-09-18 20:11:32 UTC (rev 1040) @@ -549,10 +549,14 @@ if(Instruments[nIns] != nullptr) delete Instruments[nIns]; - MODINSTRUMENT *pIns = new MODINSTRUMENT(); - if(pIns == nullptr) + try + { + Instruments[nIns] = new MODINSTRUMENT(); + } catch(MPTMemoryException) + { break; - Instruments[nIns] = pIns; + } + MODINSTRUMENT *pIns = Instruments[nIns]; m_nInstruments = max(m_nInstruments, nIns); @@ -657,10 +661,14 @@ if(Instruments[nIns] != nullptr) delete Instruments[nIns]; - MODINSTRUMENT *pIns = new MODINSTRUMENT(); - if(pIns == nullptr) + try + { + Instruments[nIns] = new MODINSTRUMENT(); + } catch(MPTMemoryException) + { break; - Instruments[nIns] = pIns; + } + MODINSTRUMENT *pIns = Instruments[nIns]; m_nInstruments = max(m_nInstruments, nIns); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |