Thomas Mullaly : urlmon: Simplified path canonicalization functions.
Alexandre Julliard
julliard at winehq.org
Wed Nov 10 11:09:40 CST 2010
Module: wine
Branch: master
Commit: 1d11185d443a08ddf50f834b8e30cefc8f295d53
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1d11185d443a08ddf50f834b8e30cefc8f295d53
Author: Thomas Mullaly <thomas.mullaly at gmail.com>
Date: Mon Nov 8 21:23:01 2010 -0500
urlmon: Simplified path canonicalization functions.
---
dlls/urlmon/uri.c | 65 ++++++++++++++++++----------------------------------
1 files changed, 23 insertions(+), 42 deletions(-)
diff --git a/dlls/urlmon/uri.c b/dlls/urlmon/uri.c
index 6e4ed06..6ed71e1 100644
--- a/dlls/urlmon/uri.c
+++ b/dlls/urlmon/uri.c
@@ -2973,6 +2973,8 @@ static BOOL canonicalize_path_hierarchical(const parse_data *data, Uri *uri,
}
for(; ptr < data->path+data->path_len; ++ptr) {
+ BOOL do_default_action = TRUE;
+
if(*ptr == '%' && !is_res) {
const WCHAR *tmp = ptr;
WCHAR val;
@@ -2986,6 +2988,7 @@ static BOOL canonicalize_path_hierarchical(const parse_data *data, Uri *uri,
if(!computeOnly)
pct_encode_val(*ptr, uri->canon_uri+uri->canon_len);
uri->canon_len += 3;
+ do_default_action = FALSE;
} else if((is_unreserved(val) && known_scheme) ||
(is_file && (is_unreserved(val) || is_reserved(val) ||
(val && flags&Uri_CREATE_FILE_USE_DOS_PATH && !is_forbidden_dos_path_char(val))))) {
@@ -2995,41 +2998,33 @@ static BOOL canonicalize_path_hierarchical(const parse_data *data, Uri *uri,
ptr += 2;
continue;
- } else {
- if(!computeOnly)
- uri->canon_uri[uri->canon_len] = *ptr;
- ++uri->canon_len;
}
} else if(*ptr == '/' && is_file && (flags & Uri_CREATE_FILE_USE_DOS_PATH)) {
/* Convert the '/' back to a '\\'. */
if(!computeOnly)
uri->canon_uri[uri->canon_len] = '\\';
++uri->canon_len;
+ do_default_action = FALSE;
} else if(*ptr == '\\' && known_scheme) {
- if(is_file && (flags & Uri_CREATE_FILE_USE_DOS_PATH)) {
- /* Don't convert the '\\' to a '/'. */
- if(!computeOnly)
- uri->canon_uri[uri->canon_len] = *ptr;
- ++uri->canon_len;
- } else {
+ if(!(is_file && (flags & Uri_CREATE_FILE_USE_DOS_PATH))) {
+ /* Convert '\\' into a '/'. */
if(!computeOnly)
uri->canon_uri[uri->canon_len] = '/';
++uri->canon_len;
+ do_default_action = FALSE;
}
} else if(known_scheme && !is_res && !is_unreserved(*ptr) && !is_reserved(*ptr) &&
(!(flags & Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS) || is_file)) {
- if(is_file && (flags & Uri_CREATE_FILE_USE_DOS_PATH)) {
- /* Don't escape the character. */
- if(!computeOnly)
- uri->canon_uri[uri->canon_len] = *ptr;
- ++uri->canon_len;
- } else {
+ if(!(is_file && (flags & Uri_CREATE_FILE_USE_DOS_PATH))) {
/* Escape the forbidden character. */
if(!computeOnly)
pct_encode_val(*ptr, uri->canon_uri+uri->canon_len);
uri->canon_len += 3;
+ do_default_action = FALSE;
}
- } else {
+ }
+
+ if(do_default_action) {
if(!computeOnly)
uri->canon_uri[uri->canon_len] = *ptr;
++uri->canon_len;
@@ -3107,6 +3102,8 @@ static BOOL canonicalize_path_opaque(const parse_data *data, Uri *uri, DWORD fla
}
for(ptr = data->path; ptr < data->path+data->path_len; ++ptr) {
+ BOOL do_default_action = TRUE;
+
if(*ptr == '%' && known_scheme) {
WCHAR val = decode_pct_val(ptr);
@@ -3117,47 +3114,31 @@ static BOOL canonicalize_path_opaque(const parse_data *data, Uri *uri, DWORD fla
ptr += 2;
continue;
- } else {
- if(!computeOnly)
- uri->canon_uri[uri->canon_len] = *ptr;
- ++uri->canon_len;
}
} else if(*ptr == '/' && is_file && (flags & Uri_CREATE_FILE_USE_DOS_PATH)) {
if(!computeOnly)
uri->canon_uri[uri->canon_len] = '\\';
++uri->canon_len;
- } else if(*ptr == '\\' && is_file) {
- if(!(flags & Uri_CREATE_FILE_USE_DOS_PATH)) {
+ do_default_action = FALSE;
+ } else if(*ptr == '\\') {
+ if(is_file && !(flags & Uri_CREATE_FILE_USE_DOS_PATH)) {
/* Convert to a '/'. */
if(!computeOnly)
uri->canon_uri[uri->canon_len] = '/';
++uri->canon_len;
- } else {
- /* Just copy it over. */
- if(!computeOnly)
- uri->canon_uri[uri->canon_len] = *ptr;
- ++uri->canon_len;
+ do_default_action = FALSE;
}
} else if(known_scheme && !is_unreserved(*ptr) && !is_reserved(*ptr) &&
!(flags & Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS)) {
- if(is_file && (flags & Uri_CREATE_FILE_USE_DOS_PATH)) {
- /* Forbidden characters aren't percent encoded for file schemes
- * with USE_DOS_PATH set.
- */
- if(!computeOnly)
- uri->canon_uri[uri->canon_len] = *ptr;
- ++uri->canon_len;
- } else if(data->scheme_type == URL_SCHEME_MK && *ptr == '\\') {
- /* MK URIs don't get '\\' percent encoded. */
- if(!computeOnly)
- uri->canon_uri[uri->canon_len] = *ptr;
- ++uri->canon_len;
- } else {
+ if(!(is_file && (flags & Uri_CREATE_FILE_USE_DOS_PATH))) {
if(!computeOnly)
pct_encode_val(*ptr, uri->canon_uri+uri->canon_len);
uri->canon_len += 3;
+ do_default_action = FALSE;
}
- } else {
+ }
+
+ if(do_default_action) {
if(!computeOnly)
uri->canon_uri[uri->canon_len] = *ptr;
++uri->canon_len;
More information about the wine-cvs
mailing list