parent
4cb0e2232a
commit
b1c301dc1c
31 changed files with 427 additions and 373 deletions
@ -0,0 +1,75 @@ |
||||
/***************************************************************************
|
||||
* Copyright (C) 2008-2012 by Andrzej Rybczak * |
||||
* electricityispower@gmail.com * |
||||
* * |
||||
* This program is free software; you can redistribute it and/or modify * |
||||
* it under the terms of the GNU General Public License as published by * |
||||
* the Free Software Foundation; either version 2 of the License, or * |
||||
* (at your option) any later version. * |
||||
* * |
||||
* This program is distributed in the hope that it will be useful, * |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of * |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * |
||||
* GNU General Public License for more details. * |
||||
* * |
||||
* You should have received a copy of the GNU General Public License * |
||||
* along with this program; if not, write to the * |
||||
* Free Software Foundation, Inc., * |
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * |
||||
***************************************************************************/ |
||||
|
||||
#include "comparators.h" |
||||
#include "settings.h" |
||||
|
||||
int CaseInsensitiveStringComparison::operator()(const std::string &a, const std::string &b) |
||||
{ |
||||
const char *i = a.c_str(); |
||||
const char *j = b.c_str(); |
||||
if (Config.ignore_leading_the) |
||||
{ |
||||
if (hasTheWord(a)) |
||||
i += 4; |
||||
if (hasTheWord(b)) |
||||
j += 4; |
||||
} |
||||
int dist; |
||||
while (!(dist = tolower(*i)-tolower(*j)) && *j) |
||||
++i, ++j; |
||||
return dist; |
||||
} |
||||
|
||||
bool CaseInsensitiveSorting::operator()(const MPD::Item &a, const MPD::Item &b) |
||||
{ |
||||
bool result = false; |
||||
if (a.type == b.type) |
||||
{ |
||||
switch (a.type) |
||||
{ |
||||
case MPD::itDirectory: |
||||
result = cmp(getBasename(a.name), getBasename(b.name)) < 0; |
||||
break; |
||||
case MPD::itPlaylist: |
||||
result = cmp(a.name, b.name) < 0; |
||||
break; |
||||
case MPD::itSong: |
||||
switch (Config.browser_sort_mode) |
||||
{ |
||||
case smName: |
||||
result = operator()(a.song, b.song); |
||||
break; |
||||
case smMTime: |
||||
result = a.song.getMTime() > b.song.getMTime(); |
||||
break; |
||||
case smCustomFormat: |
||||
result = cmp(a.song.toString(Config.browser_sort_format), b.song.toString(Config.browser_sort_format)) < 0; |
||||
break; |
||||
} |
||||
break; |
||||
default: // there is no other option, silence compiler
|
||||
assert(false); |
||||
} |
||||
} |
||||
else |
||||
result = a.type < b.type; |
||||
return result; |
||||
} |
||||
@ -0,0 +1,146 @@ |
||||
/***************************************************************************
|
||||
* Copyright (C) 2008-2012 by Andrzej Rybczak * |
||||
* electricityispower@gmail.com * |
||||
* * |
||||
* This program is free software; you can redistribute it and/or modify * |
||||
* it under the terms of the GNU General Public License as published by * |
||||
* the Free Software Foundation; either version 2 of the License, or * |
||||
* (at your option) any later version. * |
||||
* * |
||||
* This program is distributed in the hope that it will be useful, * |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of * |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * |
||||
* GNU General Public License for more details. * |
||||
* * |
||||
* You should have received a copy of the GNU General Public License * |
||||
* along with this program; if not, write to the * |
||||
* Free Software Foundation, Inc., * |
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * |
||||
***************************************************************************/ |
||||
|
||||
#include <cassert> |
||||
#include <cwctype> |
||||
#include <algorithm> |
||||
#include "utility/string.h" |
||||
|
||||
std::vector<std::string> split(const std::string &s, const std::string &delimiter) |
||||
{ |
||||
if (delimiter.empty()) |
||||
return { s }; |
||||
std::vector<std::string> result; |
||||
size_t i = 0, j = 0; |
||||
while (true) |
||||
{ |
||||
i = j; |
||||
j = s.find(delimiter, i); |
||||
if (j == std::string::npos) |
||||
break; |
||||
else |
||||
result.push_back(s.substr(i, j-i)); |
||||
j += delimiter.length(); |
||||
} |
||||
result.push_back(s.substr(i)); |
||||
return result; |
||||
} |
||||
|
||||
void replace(std::string &s, const std::string &from, const std::string &to) |
||||
{ |
||||
for (size_t i = 0; (i = s.find(from, i)) != std::string::npos; i += to.length()) |
||||
s.replace(i, from.length(), to); |
||||
} |
||||
|
||||
void lowercase(std::string &s) |
||||
{ |
||||
std::transform(s.begin(), s.end(), s.begin(), tolower); |
||||
} |
||||
|
||||
void lowercase(std::wstring &ws) |
||||
{ |
||||
std::transform(ws.begin(), ws.end(), ws.begin(), towlower); |
||||
} |
||||
|
||||
void trim(std::string &s) |
||||
{ |
||||
if (s.empty()) |
||||
return; |
||||
|
||||
size_t b = 0; |
||||
size_t e = s.length()-1; |
||||
|
||||
while (s[e] == ' ' || s[e] == '\n' || s[e] == '\t') |
||||
--e; |
||||
++e; |
||||
if (e != s.length()) |
||||
s.resize(e); |
||||
|
||||
while (s[b] == ' ' || s[b] == '\n' || s[e] == '\t') |
||||
++b; |
||||
if (b != 0) |
||||
s = s.substr(b); |
||||
} |
||||
|
||||
std::string getBasename(const std::string &path) |
||||
{ |
||||
size_t slash = path.rfind("/"); |
||||
if (slash == std::string::npos) |
||||
return path; |
||||
else |
||||
return path.substr(slash+1); |
||||
} |
||||
|
||||
std::string getParentDirectory(const std::string &path) |
||||
{ |
||||
size_t slash = path.rfind('/'); |
||||
if (slash == std::string::npos) |
||||
return "/"; |
||||
else |
||||
return path.substr(0, slash); |
||||
} |
||||
|
||||
std::string getSharedDirectory(const std::string &dir1, const std::string &dir2) |
||||
{ |
||||
size_t i = 0; |
||||
size_t min_len = std::min(dir1.length(), dir2.length()); |
||||
while (i < min_len && !dir1.compare(i, 1, dir2, i, 1)) |
||||
++i; |
||||
i = dir1.rfind("/", i); |
||||
if (i == std::string::npos) |
||||
return "/"; |
||||
else |
||||
return dir1.substr(0, i); |
||||
} |
||||
|
||||
std::string getEnclosedString(const std::string &s, char a, char b, size_t *pos) |
||||
{ |
||||
std::string result; |
||||
size_t i = s.find(a, pos ? *pos : 0); |
||||
if (i != std::string::npos) |
||||
{ |
||||
++i; |
||||
while (i < s.length() && s[i] != b) |
||||
{ |
||||
if (s[i] == '\\' && i+1 < s.length() && s[i+1] == b) |
||||
result += s[++i]; |
||||
else |
||||
result += s[i]; |
||||
++i; |
||||
} |
||||
// we want to set pos to char after b if possible
|
||||
if (i < s.length()) |
||||
++i; |
||||
} |
||||
if (pos != 0) |
||||
*pos = i; |
||||
return result; |
||||
} |
||||
|
||||
bool isInteger(const char *s) |
||||
{ |
||||
assert(s); |
||||
if (*s == '\0') |
||||
return false; |
||||
for (const char *it = s; *it != '\0'; ++it) |
||||
if (!isdigit(*it) && (it != s || *it != '-')) |
||||
return false; |
||||
return true; |
||||
} |
||||
Loading…
Reference in new issue