1
0
mirror of https://github.com/TerryCavanagh/VVVVVV.git synced 2024-06-26 14:38:30 +02:00
VVVVVV/desktop_version/src/UtilityClass.cpp
Misa ea8053303d Initialize x to 0 in ss_toi()
This fixes a source of undefined behavior, where the int returned by
ss_toi() would be random garbage memory if the string passed into it
would be empty. That's because if the string is empty, there are no
characters to parse, so nothing simply gets put into x.

The easiest way to pass an empty string in to ss_toi() would be to use
script commands with empty arguments.
2020-02-20 00:05:55 -05:00

210 lines
3.7 KiB
C++

#include "UtilityClass.h"
#include "SDL.h"
#include <sstream>
/* Used by UtilityClass::GCString to generate a button list */
const char *GCChar(SDL_GameControllerButton button)
{
if (button == SDL_CONTROLLER_BUTTON_A)
{
return "A";
}
else if (button == SDL_CONTROLLER_BUTTON_B)
{
return "B";
}
else if (button == SDL_CONTROLLER_BUTTON_X)
{
return "X";
}
else if (button == SDL_CONTROLLER_BUTTON_Y)
{
return "Y";
}
else if (button == SDL_CONTROLLER_BUTTON_BACK)
{
return "BACK";
}
else if (button == SDL_CONTROLLER_BUTTON_GUIDE)
{
return "GUIDE";
}
else if (button == SDL_CONTROLLER_BUTTON_START)
{
return "START";
}
else if (button == SDL_CONTROLLER_BUTTON_LEFTSTICK)
{
return "L3";
}
else if (button == SDL_CONTROLLER_BUTTON_RIGHTSTICK)
{
return "R3";
}
else if (button == SDL_CONTROLLER_BUTTON_LEFTSHOULDER)
{
return "LB";
}
else if (button == SDL_CONTROLLER_BUTTON_RIGHTSHOULDER)
{
return "RB";
}
SDL_assert(0 && "Unhandled button!");
return NULL;
}
int ss_toi( std::string _s )
{
std::istringstream i(_s);
int x = 0;
i >> x;
return x;
}
std::vector<std::string> split( const std::string &s, char delim, std::vector<std::string> &elems )
{
std::stringstream ss(s);
std::string item;
while(std::getline(ss, item, delim))
{
elems.push_back(item);
}
return elems;
}
std::vector<std::string> split( const std::string &s, char delim )
{
std::vector<std::string> elems;
return split(s, delim, elems);
}
UtilityClass::UtilityClass() :
glow(0),
glowdir(0)
{
for (int i = 0; i < 30; i++)
{
splitseconds.push_back(int((i * 100) / 30));
}
slowsine = 0;
globaltemp = 0;
temp = 0;
temp2 = 0;
}
std::string UtilityClass::String( int _v )
{
std::ostringstream os;
os << _v;
return(os.str());
}
std::string UtilityClass::GCString(std::vector<SDL_GameControllerButton> buttons)
{
std::string retval = "";
for (size_t i = 0; i < buttons.size(); i += 1)
{
retval += GCChar(buttons[i]);
if ((i + 1) < buttons.size())
{
retval += ",";
}
}
return retval;
}
std::string UtilityClass::twodigits( int t )
{
if (t < 10)
{
return "0" + String(t);
}
if (t >= 100)
{
return "??";
}
return String(t);
}
std::string UtilityClass::timestring( int t )
{
//given a time t in frames, return a time in seconds
tempstring = "";
temp = (t - (t % 30)) / 30;
if (temp < 60) //less than one minute
{
t = t % 30;
tempstring = String(temp) + ":" + twodigits(splitseconds[t]);
}
else
{
temp2 = (temp - (temp % 60)) / 60;
temp = temp % 60;
t = t % 30;
tempstring = String(temp2) + ":" + twodigits(temp) + ":" + twodigits(splitseconds[t]);
}
return tempstring;
}
std::string UtilityClass::number( int _t )
{
const std::string ones_place[] = {"One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"};
const std::string tens_place[] = {"Ten", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"};
const std::string teens[] = {"Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"};
if (_t < 0)
{
return "???";
}
else if (_t > 100)
{
return "Lots";
}
else if (_t == 0)
{
return "Zero";
}
else if (_t == 100)
{
return "One Hundred";
}
else if (_t >= 1 && _t <= 9)
{
return ones_place[_t-1];
}
else if (_t >= 11 && _t <= 19)
{
return teens[_t-11];
}
else if (_t % 10 == 0)
{
return tens_place[(_t/10)-1];
}
else
{
return tens_place[(_t/10)-1] + " " + ones_place[(_t%10)-1];
}
}
bool UtilityClass::intersects( SDL_Rect A, SDL_Rect B )
{
return (SDL_HasIntersection(&A, &B) == SDL_TRUE);
}
void UtilityClass::updateglow()
{
slowsine++;
if (slowsine >= 64) slowsine = 0;
if (glowdir == 0) {
glow+=2;
if (glow >= 62) glowdir = 1;
}else {
glow-=2;
if (glow < 2) glowdir = 0;
}
}