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