diff --git a/src/common/bspf.hxx b/src/common/bspf.hxx index 2de88cfec..e7cc60024 100644 --- a/src/common/bspf.hxx +++ b/src/common/bspf.hxx @@ -145,6 +145,13 @@ namespace BSPF return s; } + // Convert string to integer, using default value on any error + inline int stringToInt(const string& s, const int defaultValue = 0) + { + try { return std::stoi(s); } + catch(...) { return defaultValue; } + } + // Compare two strings, ignoring case inline int compareIgnoreCase(const string& s1, const string& s2) { diff --git a/src/emucore/Console.cxx b/src/emucore/Console.cxx index 5cef206b0..3a7e0841e 100644 --- a/src/emucore/Console.cxx +++ b/src/emucore/Console.cxx @@ -110,7 +110,7 @@ Console::Console(OSystem& osystem, unique_ptr& cart, myCart->setStartBankFromPropsFunc([this]() { const string& startbank = myProperties.get(PropType::Cart_StartBank); return (startbank == EmptyString || BSPF::equalsIgnoreCase(startbank, "AUTO")) - ? -1 : stoi(startbank); + ? -1 : BSPF::stringToInt(startbank); }); // We can only initialize after all the devices/components have been created @@ -583,13 +583,7 @@ void Console::togglePhosphor() // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void Console::changePhosphor(int direction) { - int blend = 0; - - try - { - blend = stoi(myProperties.get(PropType::Display_PPBlend)); - } - catch (...) {} + int blend = BSPF::stringToInt(myProperties.get(PropType::Display_PPBlend)); if(direction == +1) // increase blend { @@ -795,7 +789,7 @@ void Console::changeScanlineAdjust(int direction) void Console::setTIAProperties() { Int32 vcenter = BSPF::clamp( - static_cast(stoi(myProperties.get(PropType::Display_VCenter))), TIAConstants::minVcenter, TIAConstants::maxVcenter + static_cast(BSPF::stringToInt(myProperties.get(PropType::Display_VCenter))), TIAConstants::minVcenter, TIAConstants::maxVcenter ); if(myDisplayFormat == "NTSC" || myDisplayFormat == "PAL60" || diff --git a/src/emucore/EventHandler.cxx b/src/emucore/EventHandler.cxx index 74d0138c0..e3544930e 100644 --- a/src/emucore/EventHandler.cxx +++ b/src/emucore/EventHandler.cxx @@ -1162,7 +1162,7 @@ void EventHandler::setComboMap() { string key; buf >> key; - if(stoi(key) == COMBO_SIZE) + if(BSPF::stringToInt(key) == COMBO_SIZE) { // Fill the combomap table with events for as long as they exist int combocount = 0; @@ -1175,7 +1175,7 @@ void EventHandler::setComboMap() int eventcount = 0; while(buf2 >> key && eventcount < EVENTS_PER_COMBO) { - myComboTable[combocount][eventcount] = Event::Type(stoi(key)); + myComboTable[combocount][eventcount] = Event::Type(BSPF::stringToInt(key)); ++eventcount; } ++combocount; @@ -1464,7 +1464,7 @@ void EventHandler::setComboListForEvent(Event::Type event, const StringList& eve int combo = event - Event::Combo1; for(uInt32 i = 0; i < 8; ++i) { - uInt32 idx = stoi(events[i]); + uInt32 idx = BSPF::stringToInt(events[i]); if(idx < ourEmulActionList.size()) myComboTable[combo][i] = EventHandler::ourEmulActionList[idx].event; else diff --git a/src/emucore/ProfilingRunner.cxx b/src/emucore/ProfilingRunner.cxx index 3fc378907..f561dc7a1 100644 --- a/src/emucore/ProfilingRunner.cxx +++ b/src/emucore/ProfilingRunner.cxx @@ -69,7 +69,7 @@ ProfilingRunner::ProfilingRunner(int argc, char* argv[]) if (splitPoint == string::npos) run.runtime = RUNTIME_DEFAULT; else { - int runtime = stoi(arg.substr(splitPoint+1, string::npos)); + int runtime = BSPF::stringToInt(arg.substr(splitPoint+1, string::npos)); run.runtime = runtime > 0 ? runtime : RUNTIME_DEFAULT; } } diff --git a/src/emucore/Props.cxx b/src/emucore/Props.cxx index e3aa815f4..ccad01646 100644 --- a/src/emucore/Props.cxx +++ b/src/emucore/Props.cxx @@ -65,7 +65,7 @@ void Properties::set(PropType key, const string& value) case PropType::Display_PPBlend: { - int blend = stoi(myProperties[pos]); + int blend = BSPF::stringToInt(myProperties[pos]); if(blend < 0 || blend > 100) myProperties[pos] = ourDefaultProperties[pos]; break; diff --git a/src/emucore/TIASurface.cxx b/src/emucore/TIASurface.cxx index b99f33be0..46b2250c0 100644 --- a/src/emucore/TIASurface.cxx +++ b/src/emucore/TIASurface.cxx @@ -91,11 +91,7 @@ void TIASurface::initialize(const Console& console, } else { - try - { - p_blend = stoi(console.properties().get(PropType::Display_PPBlend)); - } - catch (...) {} + p_blend = BSPF::stringToInt(console.properties().get(PropType::Display_PPBlend)); enable = console.properties().get(PropType::Display_Phosphor) == "YES"; } enablePhosphor(enable, p_blend); diff --git a/src/gui/GameInfoDialog.cxx b/src/gui/GameInfoDialog.cxx index 66e8fefe9..4e58eed8b 100644 --- a/src/gui/GameInfoDialog.cxx +++ b/src/gui/GameInfoDialog.cxx @@ -653,17 +653,10 @@ void GameInfoDialog::loadEmulationProperties(const Properties& props) myPPBlend->setEnabled(!alwaysPhosphor && usePhosphor); const string& blend = props.get(PropType::Display_PPBlend); - try - { - myPPBlend->setValue(stoi(blend)); - } - catch (...) - { - myPPBlend->setValue(0); - } + myPPBlend->setValue(BSPF::stringToInt(blend)); // set vertical center - Int32 vcenter = stoi(props.get(PropType::Display_VCenter)); + Int32 vcenter = BSPF::stringToInt(props.get(PropType::Display_VCenter)); myVCenter->setValueLabel(vcenter); myVCenter->setValue(vcenter); myVCenter->setValueUnit(vcenter ? "px" : ""); @@ -712,7 +705,7 @@ void GameInfoDialog::loadControllerProperties(const Properties& props) myMouseY->setEnabled(!autoAxis); if(m_axis >> m_range) { - myMouseRange->setValue(stoi(m_range)); + myMouseRange->setValue(BSPF::stringToInt(m_range)); } else {