mirror of
https://github.com/TerryCavanagh/VVVVVV.git
synced 2024-09-28 17:27:23 +02:00
884035fd2e
Apparently it results in Undefined Behavior if the argument given isn't representable as an unsigned char. This means that (potentially) plain char and signed chars could be unsafe to use as well. It's rare that this could happen in practice, though. std::isdigit() is only used by is_positive_num() which is only used by find_tag(), so someone would have to deliberately put something crazy after an `&#` in a custom level file in order for this to happen. Still, better to be safe than sorry and all.
222 lines
4 KiB
C++
222 lines
4 KiB
C++
#include "UtilityClass.h"
|
|
|
|
#include "SDL.h"
|
|
|
|
#include <cctype>
|
|
#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
|
|
std::string 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;
|
|
}
|
|
}
|
|
|
|
bool is_positive_num(const std::string& str)
|
|
{
|
|
for (size_t i = 0; i < str.length(); i++)
|
|
{
|
|
if (!std::isdigit(static_cast<unsigned char>(str[i])))
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|