Make urldecode in-place
This commit is contained in:
parent
3d370cc2ae
commit
f1ff3aaa4c
@ -65,17 +65,6 @@ namespace Exiv2
|
|||||||
*/
|
*/
|
||||||
EXIV2API std::string urlencode(const std::string_view& str);
|
EXIV2API std::string urlencode(const std::string_view& str);
|
||||||
|
|
||||||
/*!
|
|
||||||
@brief Decode the input url.
|
|
||||||
@param str The url needs decoding.
|
|
||||||
@return the url-decoded version of str.
|
|
||||||
|
|
||||||
@note Be sure to 'free' the returned string after use with 'delete []'.
|
|
||||||
Source: http://www.geekhideout.com/urlcode.shtml
|
|
||||||
@todo This function can probably be hidden into the implementation details
|
|
||||||
*/
|
|
||||||
EXIV2API char* urldecode(const char* str);
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@brief Like urlencode(char* str) but accept the input url in the std::string and modify it.
|
@brief Like urlencode(char* str) but accept the input url in the std::string and modify it.
|
||||||
@todo This function can probably be hidden into the implementation details
|
@todo This function can probably be hidden into the implementation details
|
||||||
|
|||||||
@ -120,31 +120,24 @@ namespace Exiv2 {
|
|||||||
return encoded;
|
return encoded;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* urldecode(const char* str) {
|
void urldecode(std::string& str)
|
||||||
const char* pstr = str;
|
{
|
||||||
auto buf = new char[(strlen(str) + 1)];
|
size_t idxIn{0}, idxOut{0};
|
||||||
char* pbuf = buf;
|
size_t sizeStr = str.size();
|
||||||
while (*pstr) {
|
while (idxIn < sizeStr) {
|
||||||
if (*pstr == '%') {
|
if (str[idxIn] == '%') {
|
||||||
if (pstr[1] && pstr[2]) {
|
if (str[idxIn+1] && str[idxIn+2]) {
|
||||||
*pbuf++ = from_hex(pstr[1]) << 4 | from_hex(pstr[2]);
|
str[idxOut++] = from_hex(str[idxIn+1]) << 4 | from_hex(str[idxIn+2]);
|
||||||
pstr += 2;
|
idxIn += 2;
|
||||||
}
|
}
|
||||||
} else if (*pstr == '+') {
|
} else if (str[idxIn] == '+') {
|
||||||
*pbuf++ = ' ';
|
str[idxOut++] = ' ';
|
||||||
} else {
|
} else {
|
||||||
*pbuf++ = *pstr;
|
str[idxOut++] = str[idxIn];
|
||||||
}
|
}
|
||||||
pstr++;
|
idxIn++;
|
||||||
}
|
}
|
||||||
*pbuf = '\0';
|
str.erase(idxOut);
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
void urldecode(std::string& str) {
|
|
||||||
char* decodeStr = Exiv2::urldecode(str.c_str());
|
|
||||||
str = std::string(decodeStr);
|
|
||||||
delete [] decodeStr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://stackoverflow.com/questions/342409/how-do-i-base64-encode-decode-in-c
|
// https://stackoverflow.com/questions/342409/how-do-i-base64-encode-decode-in-c
|
||||||
|
|||||||
@ -97,15 +97,6 @@ TEST(urlencode, encodesGivenUrlWithSpace)
|
|||||||
ASSERT_STREQ("http%3a%2f%2fwww.geekhideout.com%2furl+code.shtml", url.c_str());
|
ASSERT_STREQ("http%3a%2f%2fwww.geekhideout.com%2furl+code.shtml", url.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(urldecode, decodesGivenUrl)
|
|
||||||
{
|
|
||||||
const std::string expectedDecodedUrl ("http://www.geekhideout.com/urlcode.shtml");
|
|
||||||
const std::string url ("http%3a%2f%2fwww.geekhideout.com%2furlcode.shtml");
|
|
||||||
char * url3 = urldecode(url.c_str());
|
|
||||||
ASSERT_STREQ(expectedDecodedUrl.c_str(), url3);
|
|
||||||
delete [] url3;
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(urldecode, decodesGivenUrlInPlace)
|
TEST(urldecode, decodesGivenUrlInPlace)
|
||||||
{
|
{
|
||||||
const std::string expectedDecodedUrl ("http://www.geekhideout.com/urlcode.shtml");
|
const std::string expectedDecodedUrl ("http://www.geekhideout.com/urlcode.shtml");
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user