mirror of
https://github.com/libretro/bsnes-libretro-cplusplus98.git
synced 2025-04-08 13:11:32 +00:00
130 lines
2.8 KiB
C++
130 lines
2.8 KiB
C++
#ifndef NALL_STRING_CONVERT_HPP
|
|
#define NALL_STRING_CONVERT_HPP
|
|
|
|
namespace nall {
|
|
|
|
inline char* strlower(char *str) {
|
|
if(!str) return 0;
|
|
int i = 0;
|
|
while(str[i]) {
|
|
str[i] = chrlower(str[i]);
|
|
i++;
|
|
}
|
|
return str;
|
|
}
|
|
|
|
inline char* strupper(char *str) {
|
|
if(!str) return 0;
|
|
int i = 0;
|
|
while(str[i]) {
|
|
str[i] = chrupper(str[i]);
|
|
i++;
|
|
}
|
|
return str;
|
|
}
|
|
|
|
inline char* strtr(char *dest, const char *before, const char *after) {
|
|
if(!dest || !before || !after) return dest;
|
|
int sl = strlen(dest), bsl = strlen(before), asl = strlen(after);
|
|
|
|
if(bsl != asl || bsl == 0) return dest; //patterns must be the same length for 1:1 replace
|
|
for(unsigned i = 0; i < sl; i++) {
|
|
for(unsigned l = 0; l < bsl; l++) {
|
|
if(dest[i] == before[l]) {
|
|
dest[i] = after[l];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return dest;
|
|
}
|
|
|
|
inline string& string::lower() { nall::strlower(data); return *this; }
|
|
inline string& string::upper() { nall::strupper(data); return *this; }
|
|
inline string& string::transform(const char *before, const char *after) { nall::strtr(data, before, after); return *this; }
|
|
|
|
inline uintmax_t hex(const char *str) {
|
|
if(!str) return 0;
|
|
uintmax_t result = 0;
|
|
|
|
//skip hex identifiers 0x and $, if present
|
|
if(*str == '0' && (*(str + 1) == 'X' || *(str + 1) == 'x')) str += 2;
|
|
else if(*str == '$') str++;
|
|
|
|
while(*str) {
|
|
uint8_t x = *str++;
|
|
if(x >= '0' && x <= '9') x -= '0';
|
|
else if(x >= 'A' && x <= 'F') x -= 'A' - 10;
|
|
else if(x >= 'a' && x <= 'f') x -= 'a' - 10;
|
|
else break; //stop at first invalid character
|
|
result = result * 16 + x;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
inline intmax_t integer(const char *str) {
|
|
if(!str) return 0;
|
|
intmax_t result = 0;
|
|
bool negate = false;
|
|
|
|
//check for sign
|
|
if(*str == '+') {
|
|
negate = false;
|
|
str++;
|
|
} else if(*str == '-') {
|
|
negate = true;
|
|
str++;
|
|
}
|
|
|
|
while(*str) {
|
|
uint8_t x = *str++;
|
|
if(x >= '0' && x <= '9') x -= '0';
|
|
else break; //stop at first invalid character
|
|
result = result * 10 + x;
|
|
}
|
|
|
|
return !negate ? result : -result;
|
|
}
|
|
|
|
inline uintmax_t decimal(const char *str) {
|
|
if(!str) return 0;
|
|
uintmax_t result = 0;
|
|
|
|
while(*str) {
|
|
uint8_t x = *str++;
|
|
if(x >= '0' && x <= '9') x -= '0';
|
|
else break; //stop at first invalid character
|
|
result = result * 10 + x;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
inline uintmax_t binary(const char *str) {
|
|
if(!str) return 0;
|
|
uintmax_t result = 0;
|
|
|
|
//skip bin identifiers 0b and %, if present
|
|
if(*str == '0' && (*(str + 1) == 'B' || *(str + 1) == 'b')) str += 2;
|
|
else if(*str == '%') str++;
|
|
|
|
while(*str) {
|
|
uint8_t x = *str++;
|
|
if(x == '0' || x == '1') x -= '0';
|
|
else break; //stop at first invalid character
|
|
result = result * 2 + x;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
inline double fp(const char *str) {
|
|
return strtod(str, NULL);
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|