summaryrefslogtreecommitdiff
path: root/src/htsencoding.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/htsencoding.c')
-rw-r--r--src/htsencoding.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/htsencoding.c b/src/htsencoding.c
index 184cca6..4160fa2 100644
--- a/src/htsencoding.c
+++ b/src/htsencoding.c
@@ -204,7 +204,8 @@ int hts_unescapeEntities(const char *src, char *dest, const size_t max) {
return hts_unescapeEntitiesWithCharset(src, dest, max, "UTF-8");
}
-int hts_unescapeUrl(const char *src, char *dest, const size_t max) {
+int hts_unescapeUrlSpecial(const char *src, char *dest, const size_t max,
+ const int flags) {
size_t i, j, lastI, lastJ, k, utfBufferJ, utfBufferSize;
int seenQuery = 0;
char utfBuffer[32];
@@ -239,7 +240,10 @@ int hts_unescapeUrl(const char *src, char *dest, const size_t max) {
cUtf = (unsigned char) ec;
/* Shortcut for ASCII (do not unescape non-printable) */
- if ((unsigned char) ec < 0x80 && (unsigned char) ec >= 32) {
+ if (
+ (cUtf < 0x80 && cUtf >= 32)
+ && ( flags & UNESCAPE_URL_NO_ASCII ) == 0
+ ) {
/* Rollback new write position and character */
j = lastJ;
c = ec;
@@ -251,7 +255,7 @@ int hts_unescapeUrl(const char *src, char *dest, const size_t max) {
/* ASCII (and not in %xx) */
else if (cUtf < 0x80 && i != lastI + 1) {
k = 0; /* cancel any sequence */
- if (!seenQuery && c == '?') {
+ if (c == '?' && !seenQuery) {
seenQuery = 1;
}
}
@@ -316,3 +320,7 @@ int hts_unescapeUrl(const char *src, char *dest, const size_t max) {
return 0;
}
+
+int hts_unescapeUrl(const char *src, char *dest, const size_t max) {
+ return hts_unescapeUrlSpecial(src, dest, max, 0);
+}