Dylan Smith : richedit: Improve efficiency of ME_IsCandidateAnURL.
Alexandre Julliard
julliard at winehq.org
Wed Aug 12 11:10:35 CDT 2009
Module: wine
Branch: master
Commit: 0362b1b0870a212f80489627ea568e8503d28b4e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0362b1b0870a212f80489627ea568e8503d28b4e
Author: Dylan Smith <dylan.ah.smith at gmail.com>
Date: Wed Aug 12 09:05:56 2009 -0400
richedit: Improve efficiency of ME_IsCandidateAnURL.
The code was previously getting the same text in the loop from the
editor, and it was converting each of the prefixes to compare against
for each URL candidate.
---
dlls/riched20/editor.c | 62 ++++++++++++++++++++---------------------------
1 files changed, 26 insertions(+), 36 deletions(-)
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index 79f6be2..c326ae8 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -4766,51 +4766,38 @@ static BOOL ME_FindNextURLCandidate(ME_TextEditor *editor, int sel_min, int sel_
/**
* This proc evaluates the selection and returns TRUE if it can be considered an URL
*/
-static BOOL ME_IsCandidateAnURL(ME_TextEditor *editor, int sel_min, int sel_max)
+static BOOL ME_IsCandidateAnURL(ME_TextEditor *editor, const ME_Cursor *start, int nChars)
{
+#define MAX_PREFIX_LEN 9
struct prefix_s {
- const char *text;
+ const WCHAR text[MAX_PREFIX_LEN];
int length;
- } prefixes[12] = {
- /* Code below depends on these being in decreasing length order! */
- {"prospero:", 10},
- {"telnet:", 8},
- {"gopher:", 8},
- {"mailto:", 8},
- {"https:", 7},
- {"file:", 6},
- {"news:", 6},
- {"wais:", 6},
- {"nntp:", 6},
- {"http:", 5},
- {"www.", 5},
- {"ftp:", 5},
+ }prefixes[] = {
+ {{'p','r','o','s','p','e','r','o',':'}, 9},
+ {{'t','e','l','n','e','t',':'}, 7},
+ {{'g','o','p','h','e','r',':'}, 7},
+ {{'m','a','i','l','t','o',':'}, 7},
+ {{'h','t','t','p','s',':'}, 6},
+ {{'f','i','l','e',':'}, 5},
+ {{'n','e','w','s',':'}, 5},
+ {{'w','a','i','s',':'}, 5},
+ {{'n','n','t','p',':'}, 5},
+ {{'h','t','t','p',':'}, 5},
+ {{'w','w','w','.'}, 4},
+ {{'f','t','p',':'}, 4},
};
- LPWSTR bufferW = NULL;
- WCHAR bufW[32];
+ WCHAR bufferW[MAX_PREFIX_LEN + 1];
unsigned int i;
- ME_Cursor sel_start;
- ME_CursorFromCharOfs(editor, sel_min, &sel_start);
- if (sel_max == -1) sel_max = ME_GetTextLength(editor);
- assert(sel_min <= sel_max);
- for (i = 0; i < sizeof(prefixes) / sizeof(struct prefix_s); i++)
+ ME_GetTextW(editor, bufferW, MAX_PREFIX_LEN, start, nChars, 0);
+ for (i = 0; i < sizeof(prefixes) / sizeof(*prefixes); i++)
{
- if (sel_max - sel_min < prefixes[i].length) continue;
- if (bufferW == NULL) {
- bufferW = heap_alloc((sel_max - sel_min + 1) * sizeof(WCHAR));
- }
- ME_GetTextW(editor, bufferW, sel_max - sel_min, &sel_start,
- lstrlenA(prefixes[i].text), 0);
- MultiByteToWideChar(CP_ACP, 0, prefixes[i].text, -1, bufW, 32);
- if (!lstrcmpW(bufW, bufferW))
- {
- heap_free(bufferW);
+ if (nChars < prefixes[i].length) continue;
+ if (!memcmp(prefixes[i].text, bufferW, prefixes[i].length * sizeof(WCHAR)))
return TRUE;
- }
}
- heap_free(bufferW);
return FALSE;
+#undef MAX_PREFIX_LEN
}
/**
@@ -4837,11 +4824,14 @@ static BOOL ME_UpdateLinkAttribute(ME_TextEditor *editor, int sel_min, int sel_m
if (ME_FindNextURLCandidate(editor, sel_min, sel_max, &cMin, &cMax))
{
+ ME_Cursor candidateStart;
/* Section before candidate is not an URL */
beforeURL[0] = sel_min;
beforeURL[1] = cMin;
- if (ME_IsCandidateAnURL(editor, cMin, cMax))
+ ME_CursorFromCharOfs(editor, cMin, &candidateStart);
+ if (ME_IsCandidateAnURL(editor, &candidateStart,
+ (cMax == -1 ? INT_MAX : cMax) - cMin))
{
inURL[0] = cMin; inURL[1] = cMax;
}
More information about the wine-cvs
mailing list