From 5fd5ecad8c2bd1e8846c11fa9b281f0f4ab8a4a7 Mon Sep 17 00:00:00 2001 From: Michael Krelin Date: Sun, 02 Mar 2008 23:52:14 +0000 Subject: aded util::url_decode() Signed-off-by: Michael Krelin --- (limited to 'lib') diff --git a/lib/util.cc b/lib/util.cc index a6e08e2..3e7f3aa 100644 --- a/lib/util.cc +++ b/lib/util.cc @@ -192,6 +192,34 @@ namespace opkele { return rv; } + string url_decode(const string& str) { + string rv; + back_insert_iterator ii(rv); + for(string::const_iterator i=str.begin(),ie=str.end(); + i!=ie;++i) { + switch(*i) { + case '+': + *(ii++) = ' '; break; + case '%': + ++i; + static char tmp[3] = {0,0,0}; + if(i==ie) + throw failed_conversion(OPKELE_CP_ "trailing percent in the url-encoded string"); + tmp[0] == *(i++); + if(i==ie) + throw failed_conversion(OPKELE_CP_ "not enough hexadecimals after the percent sign in url-encoded string"); + tmp[1] == *i; + if(!(isxdigit(tmp[0]) && isxdigit(tmp[1]))) + throw failed_conversion(OPKELE_CP_ "non-hex follows percent in url-encoded string"); + *(ii++) = strtol(tmp,0,16); + break; + default: + *(ii++) = *i; break; + } + } + return rv; + } + string attr_escape(const string& str) { static const char *unsafechars = "<>&\n\"'"; string rv; -- cgit v0.9.0.2