Alexandre Julliard : dbghelp: Allocate enough memory initially for regexps instead of growing the buffer .
Alexandre Julliard
julliard at winehq.org
Wed Feb 4 09:15:35 CST 2009
Module: wine
Branch: master
Commit: e9610f674ca1e2a923e8f56ccf4b0238e5065b7c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e9610f674ca1e2a923e8f56ccf4b0238e5065b7c
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Feb 4 13:00:31 2009 +0100
dbghelp: Allocate enough memory initially for regexps instead of growing the buffer.
---
dlls/dbghelp/symbol.c | 36 ++++++++++++++++--------------------
1 files changed, 16 insertions(+), 20 deletions(-)
diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c
index 4df69d1..5a05928 100644
--- a/dlls/dbghelp/symbol.c
+++ b/dlls/dbghelp/symbol.c
@@ -67,12 +67,6 @@ int symt_cmp_addr(const void* p1, const void* p2)
return cmp_addr(a1, a2);
}
-static inline void re_append(char** mask, unsigned* len, char ch)
-{
- *mask = HeapReAlloc(GetProcessHeap(), 0, *mask, ++(*len));
- (*mask)[*len - 2] = ch;
-}
-
/* transforms a dbghelp's regular expression into a POSIX one
* Here are the valid dbghelp reg ex characters:
* * 0 or more characters
@@ -84,42 +78,44 @@ static inline void re_append(char** mask, unsigned* len, char ch)
*/
static void compile_regex(const char* str, int numchar, regex_t* re, BOOL _case)
{
- char* mask = HeapAlloc(GetProcessHeap(), 0, 1);
- unsigned len = 1;
+ char *mask, *p;
BOOL in_escape = FALSE;
unsigned flags = REG_NOSUB;
- re_append(&mask, &len, '^');
+ if (numchar == -1) numchar = strlen( str );
+
+ p = mask = HeapAlloc( GetProcessHeap(), 0, 2 * numchar + 3 );
+ *p++ = '^';
while (*str && numchar--)
{
/* FIXME: this shouldn't be valid on '-' */
if (in_escape)
{
- re_append(&mask, &len, '\\');
- re_append(&mask, &len, *str);
+ *p++ = '\\';
+ *p++ = *str;
in_escape = FALSE;
}
else switch (*str)
{
case '\\': in_escape = TRUE; break;
- case '*': re_append(&mask, &len, '.'); re_append(&mask, &len, '*'); break;
- case '?': re_append(&mask, &len, '.'); break;
- case '#': re_append(&mask, &len, '*'); break;
+ case '*': *p++ = '.'; *p++ = '*'; break;
+ case '?': *p++ = '.'; break;
+ case '#': *p++ = '*'; break;
/* escape some valid characters in dbghelp reg exp:s */
- case '$': re_append(&mask, &len, '\\'); re_append(&mask, &len, '$'); break;
+ case '$': *p++ = '\\'; *p++ = '$'; break;
/* +, [, ], - are the same in dbghelp & POSIX, use them as any other char */
- default: re_append(&mask, &len, *str); break;
+ default: *p++ = *str; break;
}
str++;
}
if (in_escape)
{
- re_append(&mask, &len, '\\');
- re_append(&mask, &len, '\\');
+ *p++ = '\\';
+ *p++ = '\\';
}
- re_append(&mask, &len, '$');
- mask[len - 1] = '\0';
+ *p++ = '$';
+ *p = 0;
if (_case) flags |= REG_ICASE;
if (regcomp(re, mask, flags)) FIXME("Couldn't compile %s\n", mask);
HeapFree(GetProcessHeap(), 0, mask);
More information about the wine-cvs
mailing list