ocarina/core/string.cpp

93 lines
1.6 KiB
C++
Raw Normal View History

/**
* Copyright 2015 (c) Anna Schumaker.
*/
#include <core/string.h>
#define O_SECONDS (1)
#define O_MINUTES (60)
#define O_HOURS (60 * O_MINUTES)
#define O_DAYS (24 * O_HOURS)
static unsigned int factor[4] = { O_DAYS, O_HOURS, O_MINUTES, O_SECONDS };
static const char *field[4] = { "day", "hour", "minute", "second" };
gchar *string_sec2str(unsigned int sec)
{
return g_strdup_printf("%u:%02u", sec / 60, sec % 60);
}
const std::string string :: sec2str_detailed(unsigned int sec)
{
gchar *tmp;
unsigned int val;
std::string res;
gchar *g_res = g_strdup("");
for (unsigned int i = 0; i < 4; i++) {
val = sec / factor[i];
sec %= factor[i];
if (val == 0)
continue;
tmp = g_strdup_printf("%s%u %s%s%s", g_res, val, field[i],
(val > 1) ? "s" : "",
(sec > 0) ? ", " : "");
g_free(g_res);
g_res = tmp;
}
res = g_res;
g_free(g_res);
return res;
}
static char _to_lower(char c)
{
if ((c >= 'a') && (c <= 'z'))
return c;
if ((c >= '0') && (c <= '9'))
return c;
if ((c >= 'A') && (c <= 'Z'))
return c + ('a' - 'A');
switch (c) {
case '\\':
case '/':
case ',':
case ';':
case '(':
case ')':
case '_':
case '-':
case '~':
case '+':
case '"':
case ' ':
case ' ':
return ' ';
default:
return 0;
}
}
const std::string string :: lowercase(const std::string &str)
{
std::string ret;
char c, last = ' ';
for (unsigned int i = 0; i < str.size(); i++) {
c = _to_lower(str[i]);
if (c > 0) {
if ((c != ' ') || (last != ' '))
ret += c;
last = c;
}
}
if (ret[ret.size() - 1] == ' ')
return ret.substr(0, ret.size() - 1);
return ret;
}