X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fpbd%2Fconvert.cc;h=c9af72750434e32dec7a4874d479cd4fe6545b1e;hb=89475b2c952f26db5aa77df592078656462a43c2;hp=02d7f3c0a415fcf9621a7d0bef8d20f7de2bd542;hpb=5c73926324ea56e652409b41dd7f308af02931e1;p=ardour.git diff --git a/libs/pbd/convert.cc b/libs/pbd/convert.cc index 02d7f3c0a4..c9af727504 100644 --- a/libs/pbd/convert.cc +++ b/libs/pbd/convert.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2006 Paul Davis + Copyright (C) 2006 Paul Davis 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 @@ -18,6 +18,9 @@ */ #include +#include +#include + #include #include #include @@ -28,9 +31,11 @@ #endif #include +#include + #include "pbd/convert.h" -#include "i18n.h" +#include "pbd/i18n.h" using std::string; using std::vector; @@ -49,6 +54,24 @@ capitalize (const string& str) return ret; } +string +downcase (const string& str) +{ + string copy (str); + std::transform (copy.begin(), copy.end(), copy.begin(), ::tolower); + return copy; +} + +const char* +downcase (const char* str) +{ + char *copy = strdup (str); + for (char* p = copy; *p; ++p) { + *p = tolower (*p); + } + return copy; +} + string short_version (string orig, string::size_type target_length) { @@ -109,7 +132,7 @@ short_version (string orig, string::size_type target_length) } /* whatever the length is now, use it */ - + return orig; } @@ -149,8 +172,8 @@ internationalize (const char *package_name, const char **array) return v; } -static int32_t -int_from_hex (char hic, char loc) +static int32_t +int_from_hex (char hic, char loc) { int hi; /* hi byte */ int lo; /* low byte */ @@ -164,9 +187,9 @@ int_from_hex (char hic, char loc) } else if( ('A'<=hi) && (hi<='F') ) { hi -= ('A'-10); } - + lo = (int) loc; - + if( ('0'<=lo) && (lo<='9') ) { lo -= '0'; } else if( ('a'<=lo) && (lo<='f') ) { @@ -178,94 +201,23 @@ int_from_hex (char hic, char loc) return lo + (16 * hi); } -void -url_decode (string& url) +string +url_decode (string const & url) { - string::iterator last; - string::iterator next; - - for (string::iterator i = url.begin(); i != url.end(); ++i) { - if ((*i) == '+') { - *i = ' '; - } - } - - if (url.length() <= 3) { - return; - } - - last = url.end(); - - --last; /* points at last char */ - --last; /* points at last char - 1 */ - - for (string::iterator i = url.begin(); i != last; ) { - - if (*i == '%') { - - next = i; - - url.erase (i); - - i = next; - ++next; - - if (isxdigit (*i) && isxdigit (*next)) { - /* replace first digit with char */ - *i = int_from_hex (*i,*next); - ++i; /* points at 2nd of 2 digits */ - url.erase (i); - } + string decoded; + + for (string::size_type i = 0; i < url.length(); ++i) { + if (url[i] == '+') { + decoded += ' '; + } else if (url[i] == '%' && i <= url.length() - 3) { + decoded += char (int_from_hex (url[i + 1], url[i + 2])); + i += 2; } else { - ++i; + decoded += url[i]; } } -} - -void -url_decode (ustring& url) -{ - ustring::iterator last; - ustring::iterator next; - - for (ustring::iterator i = url.begin(); i != url.end(); ++i) { - if ((*i) == '+') { - next = i; - ++next; - url.replace (i, next, 1, ' '); - } - } - - if (url.length() <= 3) { - return; - } - - last = url.end(); - --last; /* points at last char */ - --last; /* points at last char - 1 */ - - for (ustring::iterator i = url.begin(); i != last; ) { - - if (*i == '%') { - - next = i; - - url.erase (i); - - i = next; - ++next; - - if (isxdigit (*i) && isxdigit (*next)) { - /* replace first digit with char */ - url.replace (i, next, 1, (gunichar) int_from_hex (*i,*next)); - ++i; /* points at 2nd of 2 digits */ - url.erase (i); - } - } else { - ++i; - } - } + return decoded; } #if 0 @@ -297,18 +249,18 @@ length2string (const int64_t frames, const double sample_rate) secs -= (hrs * 3600LL); int64_t mins = secs / 60LL; secs -= (mins * 60LL); - + int64_t total_secs = (hrs * 3600LL) + (mins * 60LL) + secs; int64_t frames_remaining = (int64_t) floor (frames - (total_secs * sample_rate)); float fractional_secs = (float) frames_remaining / sample_rate; - + char duration_str[64]; sprintf (duration_str, "%02" PRIi64 ":%02" PRIi64 ":%05.2f", hrs, mins, (float) secs + fractional_secs); - + return duration_str; } -static bool +static bool chars_equal_ignore_case(char x, char y) { /* app should have called setlocale() if its wants this comparison to be @@ -317,7 +269,7 @@ chars_equal_ignore_case(char x, char y) return toupper (x) == toupper (y); } -bool +bool strings_equal_ignore_case (const string& a, const string& b) { if (a.length() == b.length()) { @@ -336,7 +288,10 @@ sgettext (const char* domain_name, const char* msgid) { const char * msgval = dgettext (domain_name, msgid); if (msgval == msgid) { - msgval = strrchr (msgid, '|') + 1; + const char * p = strrchr (msgid, '|'); + if (p) { + msgval = p + 1; + } } return msgval; }