Mike McCormack : wininet: Use a lookup table sorted by index so we don' t need a loop to do lookups.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Mar 30 05:44:02 CST 2006


Module: wine
Branch: refs/heads/master
Commit: 7f5e273214bb4d75824efc7133b366b4703450a6
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=7f5e273214bb4d75824efc7133b366b4703450a6

Author: Mike McCormack <mike at codeweavers.com>
Date:   Thu Mar 30 18:02:54 2006 +0900

wininet: Use a lookup table sorted by index so we don't need a loop to do lookups.

---

 dlls/wininet/http.c |  156 ++++++++++++++++++++++++++-------------------------
 1 files changed, 79 insertions(+), 77 deletions(-)

diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index 70dfc38..1e32e4c 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -1163,12 +1163,6 @@ lend:
     return handle;
 }
 
-typedef struct std_hdr_data
-{
-	const WCHAR* hdrStr;
-	INT hdrIndex;
-} std_hdr_data;
-
 static const WCHAR szAccept[] = { 'A','c','c','e','p','t',0 };
 static const WCHAR szAccept_Charset[] = { 'A','c','c','e','p','t','-','C','h','a','r','s','e','t', 0 };
 static const WCHAR szAccept_Encoding[] = { 'A','c','c','e','p','t','-','E','n','c','o','d','i','n','g',0 };
@@ -1223,65 +1217,82 @@ static const WCHAR szVia[] = { 'V','i','
 static const WCHAR szWarning[] = { 'W','a','r','n','i','n','g',0 };
 static const WCHAR szWWW_Authenticate[] = { 'W','W','W','-','A','u','t','h','e','n','t','i','c','a','t','e',0 };
 
-static const std_hdr_data SORTED_STANDARD_HEADERS[] = {
-    {szAccept,			HTTP_QUERY_ACCEPT,},
-    {szAccept_Charset,		HTTP_QUERY_ACCEPT_CHARSET,},
-    {szAccept_Encoding,		HTTP_QUERY_ACCEPT_ENCODING,},
-    {szAccept_Language,		HTTP_QUERY_ACCEPT_LANGUAGE,},
-    {szAccept_Ranges,		HTTP_QUERY_ACCEPT_RANGES,},
-    {szAge,			HTTP_QUERY_AGE,},
-    {szAllow,			HTTP_QUERY_ALLOW,},
-    {szAuthorization,		HTTP_QUERY_AUTHORIZATION,},
-    {szCache_Control,		HTTP_QUERY_CACHE_CONTROL,},
-    {szConnection,		HTTP_QUERY_CONNECTION,},
-    {szContent_Base,		HTTP_QUERY_CONTENT_BASE,},
-    {szContent_Encoding,	HTTP_QUERY_CONTENT_ENCODING,},
-    {szContent_ID,		HTTP_QUERY_CONTENT_ID,},
-    {szContent_Language,	HTTP_QUERY_CONTENT_LANGUAGE,},
-    {szContent_Length,		HTTP_QUERY_CONTENT_LENGTH,},
-    {szContent_Location,	HTTP_QUERY_CONTENT_LOCATION,},
-    {szContent_MD5,		HTTP_QUERY_CONTENT_MD5,},
-    {szContent_Range,		HTTP_QUERY_CONTENT_RANGE,},
-    {szContent_Transfer_Encoding,HTTP_QUERY_CONTENT_TRANSFER_ENCODING,},
-    {szContent_Type,		HTTP_QUERY_CONTENT_TYPE,},
-    {szCookie,			HTTP_QUERY_COOKIE,},
-    {szDate,			HTTP_QUERY_DATE,},
-    {szETag,			HTTP_QUERY_ETAG,},
-    {szExpect,			HTTP_QUERY_EXPECT,},
-    {szExpires,			HTTP_QUERY_EXPIRES,},
-    {szFrom,			HTTP_QUERY_DERIVED_FROM,},
-    {szHost,			HTTP_QUERY_HOST,},
-    {szIf_Match,		HTTP_QUERY_IF_MATCH,},
-    {szIf_Modified_Since,	HTTP_QUERY_IF_MODIFIED_SINCE,},
-    {szIf_None_Match,		HTTP_QUERY_IF_NONE_MATCH,},
-    {szIf_Range,		HTTP_QUERY_IF_RANGE,},
-    {szIf_Unmodified_Since,	HTTP_QUERY_IF_UNMODIFIED_SINCE,},
-    {szLast_Modified,		HTTP_QUERY_LAST_MODIFIED,},
-    {szLocation,		HTTP_QUERY_LOCATION,},
-    {szMax_Forwards,		HTTP_QUERY_MAX_FORWARDS,},
-    {szMime_Version,		HTTP_QUERY_MIME_VERSION,},
-    {szPragma,			HTTP_QUERY_PRAGMA,},
-    {szProxy_Authenticate,	HTTP_QUERY_PROXY_AUTHENTICATE,},
-    {szProxy_Authorization,	HTTP_QUERY_PROXY_AUTHORIZATION,},
-    {szProxy_Connection,	HTTP_QUERY_PROXY_CONNECTION,},
-    {szPublic,			HTTP_QUERY_PUBLIC,},
-    {szRange,			HTTP_QUERY_RANGE,},
-    {szReferer,			HTTP_QUERY_REFERER,},
-    {szRetry_After,		HTTP_QUERY_RETRY_AFTER,},
-    {szServer,			HTTP_QUERY_SERVER,},
-    {szSet_Cookie,		HTTP_QUERY_SET_COOKIE,},
-    {szStatus,			HTTP_QUERY_STATUS_CODE,},
-    {szTransfer_Encoding,	HTTP_QUERY_TRANSFER_ENCODING,},
-    {szUnless_Modified_Since,	HTTP_QUERY_UNLESS_MODIFIED_SINCE,},
-    {szUpgrade,			HTTP_QUERY_UPGRADE,},
-    {szURI,			HTTP_QUERY_URI,},
-    {szUser_Agent,		HTTP_QUERY_USER_AGENT,},
-    {szVary,			HTTP_QUERY_VARY,},
-    {szVia,			HTTP_QUERY_VIA,},
-    {szWarning,			HTTP_QUERY_WARNING,},
-    {szWWW_Authenticate,	HTTP_QUERY_WWW_AUTHENTICATE,},
+static const LPCWSTR header_lookup[] = {
+    szMime_Version,		/* HTTP_QUERY_MIME_VERSION = 0 */
+    szContent_Type,		/* HTTP_QUERY_CONTENT_TYPE = 1 */
+    szContent_Transfer_Encoding,/* HTTP_QUERY_CONTENT_TRANSFER_ENCODING = 2 */
+    szContent_ID,		/* HTTP_QUERY_CONTENT_ID = 3 */
+    NULL,			/* HTTP_QUERY_CONTENT_DESCRIPTION = 4 */
+    szContent_Length,		/* HTTP_QUERY_CONTENT_LENGTH =  5 */
+    szContent_Language,		/* HTTP_QUERY_CONTENT_LANGUAGE =  6 */
+    szAllow,			/* HTTP_QUERY_ALLOW = 7 */
+    szPublic,			/* HTTP_QUERY_PUBLIC = 8 */
+    szDate,			/* HTTP_QUERY_DATE = 9 */
+    szExpires,			/* HTTP_QUERY_EXPIRES = 10 */
+    szLast_Modified,		/* HTTP_QUERY_LAST_MODIFIED = 11 */
+    NULL,			/* HTTP_QUERY_MESSAGE_ID = 12 */
+    szURI,			/* HTTP_QUERY_URI = 13 */
+    szFrom,			/* HTTP_QUERY_DERIVED_FROM = 14 */
+    NULL,			/* HTTP_QUERY_COST = 15 */
+    NULL,			/* HTTP_QUERY_LINK = 16 */
+    szPragma,			/* HTTP_QUERY_PRAGMA = 17 */
+    NULL,			/* HTTP_QUERY_VERSION = 18 */
+    szStatus,			/* HTTP_QUERY_STATUS_CODE = 19 */
+    NULL,			/* HTTP_QUERY_STATUS_TEXT = 20 */
+    NULL,			/* HTTP_QUERY_RAW_HEADERS = 21 */
+    NULL,			/* HTTP_QUERY_RAW_HEADERS_CRLF = 22 */
+    szConnection,		/* HTTP_QUERY_CONNECTION = 23 */
+    szAccept,			/* HTTP_QUERY_ACCEPT = 24 */
+    szAccept_Charset,		/* HTTP_QUERY_ACCEPT_CHARSET = 25 */
+    szAccept_Encoding,		/* HTTP_QUERY_ACCEPT_ENCODING = 26 */
+    szAccept_Language,		/* HTTP_QUERY_ACCEPT_LANGUAGE = 27 */
+    szAuthorization,		/* HTTP_QUERY_AUTHORIZATION = 28 */
+    szContent_Encoding,		/* HTTP_QUERY_CONTENT_ENCODING = 29 */
+    NULL,			/* HTTP_QUERY_FORWARDED = 30 */
+    NULL,			/* HTTP_QUERY_FROM = 31 */
+    szIf_Modified_Since,	/* HTTP_QUERY_IF_MODIFIED_SINCE = 32 */
+    szLocation,			/* HTTP_QUERY_LOCATION = 33 */
+    NULL,			/* HTTP_QUERY_ORIG_URI = 34 */
+    szReferer,			/* HTTP_QUERY_REFERER = 35 */
+    szRetry_After,		/* HTTP_QUERY_RETRY_AFTER = 36 */
+    szServer,			/* HTTP_QUERY_SERVER = 37 */
+    NULL,			/* HTTP_TITLE = 38 */
+    szUser_Agent,		/* HTTP_QUERY_USER_AGENT = 39 */
+    szWWW_Authenticate,		/* HTTP_QUERY_WWW_AUTHENTICATE = 40 */
+    szProxy_Authenticate,	/* HTTP_QUERY_PROXY_AUTHENTICATE = 41 */
+    szAccept_Ranges,		/* HTTP_QUERY_ACCEPT_RANGES = 42 */
+    szSet_Cookie,		/* HTTP_QUERY_SET_COOKIE = 43 */
+    szCookie,			/* HTTP_QUERY_COOKIE = 44 */
+    NULL,			/* HTTP_QUERY_REQUEST_METHOD = 45 */
+    NULL,			/* HTTP_QUERY_REFRESH = 46 */
+    NULL,			/* HTTP_QUERY_CONTENT_DISPOSITION = 47 */
+    szAge,			/* HTTP_QUERY_AGE = 48 */
+    szCache_Control,		/* HTTP_QUERY_CACHE_CONTROL = 49 */
+    szContent_Base,		/* HTTP_QUERY_CONTENT_BASE = 50 */
+    szContent_Location,		/* HTTP_QUERY_CONTENT_LOCATION = 51 */
+    szContent_MD5,		/* HTTP_QUERY_CONTENT_MD5 = 52 */
+    szContent_Range,		/* HTTP_QUERY_CONTENT_RANGE = 53 */
+    szETag,			/* HTTP_QUERY_ETAG = 54 */
+    szHost,			/* HTTP_QUERY_HOST = 55 */
+    szIf_Match,			/* HTTP_QUERY_IF_MATCH = 56 */
+    szIf_None_Match,		/* HTTP_QUERY_IF_NONE_MATCH = 57 */
+    szIf_Range,			/* HTTP_QUERY_IF_RANGE = 58 */
+    szIf_Unmodified_Since,	/* HTTP_QUERY_IF_UNMODIFIED_SINCE = 59 */
+    szMax_Forwards,		/* HTTP_QUERY_MAX_FORWARDS = 60 */
+    szProxy_Authorization,	/* HTTP_QUERY_PROXY_AUTHORIZATION = 61 */
+    szRange,			/* HTTP_QUERY_RANGE = 62 */
+    szTransfer_Encoding,	/* HTTP_QUERY_TRANSFER_ENCODING = 63 */
+    szUpgrade,			/* HTTP_QUERY_UPGRADE = 64 */
+    szVary,			/* HTTP_QUERY_VARY = 65 */
+    szVia,			/* HTTP_QUERY_VIA = 66 */
+    szWarning,			/* HTTP_QUERY_WARNING = 67 */
+    szExpect,			/* HTTP_QUERY_EXPECT = 68 */
+    szProxy_Connection,		/* HTTP_QUERY_PROXY_CONNECTION = 69 */
+    szUnless_Modified_Since,	/* HTTP_QUERY_UNLESS_MODIFIED_SINCE = 70 */
 };
 
+#define LAST_TABLE_HEADER (sizeof(header_lookup)/sizeof(header_lookup[0]))
+
 /***********************************************************************
  *           HTTP_HttpQueryInfoW (internal)
  */
@@ -1384,20 +1395,11 @@ static BOOL WINAPI HTTP_HttpQueryInfoW( 
             return TRUE;
         }
     default:
-        if (level >= 0 && level <= HTTP_QUERY_MAX )
-        {
-            int i;
-            for (i = 0; i < sizeof(SORTED_STANDARD_HEADERS)/sizeof(std_hdr_data) ; i++)
-            {
-                if (SORTED_STANDARD_HEADERS[i].hdrIndex == level)
-                {
-                    index = HTTP_GetCustomHeaderIndex(lpwhr,
-                            (LPWSTR)SORTED_STANDARD_HEADERS[i].hdrStr,
-                            requested_index,request_only);
-                    break;
-                }
-            }
-        }
+        assert (LAST_TABLE_HEADER == (HTTP_QUERY_UNLESS_MODIFIED_SINCE + 1));
+
+        if (level >= 0 && level < LAST_TABLE_HEADER && header_lookup[level])
+            index = HTTP_GetCustomHeaderIndex(lpwhr, header_lookup[level],
+                                              requested_index,request_only);
     }
 
     if (index >= 0)




More information about the wine-cvs mailing list