Alexandre Julliard : dbghelp: Moved SymEnumLines to symbol. c to reuse the regex support.

Alexandre Julliard julliard at winehq.org
Wed Feb 4 09:15:36 CST 2009


Module: wine
Branch: master
Commit: 601a1364b95ff1e72a9e1fbc08feb14fce9db2eb
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=601a1364b95ff1e72a9e1fbc08feb14fce9db2eb

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Feb  4 13:13:08 2009 +0100

dbghelp: Moved SymEnumLines to symbol.c to reuse the regex support.

---

 dlls/dbghelp/source.c |  113 -------------------------------------------------
 dlls/dbghelp/symbol.c |  109 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 109 insertions(+), 113 deletions(-)

diff --git a/dlls/dbghelp/source.c b/dlls/dbghelp/source.c
index 8eef337..dd8fc6e 100644
--- a/dlls/dbghelp/source.c
+++ b/dlls/dbghelp/source.c
@@ -26,9 +26,6 @@
 
 #include "dbghelp_private.h"
 #include "wine/debug.h"
-#ifdef HAVE_REGEX_H
-# include <regex.h>
-#endif
 
 WINE_DEFAULT_DEBUG_CHANNEL(dbghelp);
 
@@ -154,116 +151,6 @@ BOOL WINAPI SymEnumSourceFiles(HANDLE hProcess, ULONG64 ModBase, PCSTR Mask,
     return TRUE;
 }
 
-static inline void re_append(char** mask, unsigned* len, char ch)
-{
-    *mask = HeapReAlloc(GetProcessHeap(), 0, *mask, ++(*len));
-    (*mask)[*len - 2] = ch;
-}
-
-static BOOL compile_regex(regex_t* re, const char* srcfile)
-{
-    char*                       mask;
-    unsigned                    len = 1;
-
-    mask = HeapAlloc(GetProcessHeap(), 0, 1);
-    re_append(&mask, &len, '^');
-    if (!srcfile || !*srcfile) re_append(&mask, &len, '*');
-    else while (*srcfile)
-    {
-        switch (*srcfile)
-        {
-        case '\\':
-        case '/':
-            re_append(&mask, &len, '[');
-            re_append(&mask, &len, '\\');
-            re_append(&mask, &len, '\\');
-            re_append(&mask, &len, '/');
-            re_append(&mask, &len, ']');
-            break;
-        case '.':
-            re_append(&mask, &len, '\\');
-            re_append(&mask, &len, '.');
-            break;
-        default:
-            re_append(&mask, &len, *srcfile);
-            break;
-        }
-        srcfile++;
-    }
-    re_append(&mask, &len, '$');
-    mask[len - 1] = '\0';
-    len = regcomp(re, mask, REG_NOSUB);
-    HeapFree(GetProcessHeap(), 0, mask);
-    if (len)
-    {
-        FIXME("Couldn't compile %s\n", mask);
-        SetLastError(ERROR_INVALID_PARAMETER);
-        return FALSE;
-    }
-    return TRUE;
-}
-
-/******************************************************************
- *		SymEnumLines (DBGHELP.@)
- *
- */
-BOOL WINAPI SymEnumLines(HANDLE hProcess, ULONG64 base, PCSTR compiland,
-                         PCSTR srcfile, PSYM_ENUMLINES_CALLBACK cb, PVOID user)
-{
-    struct module_pair          pair;
-    struct hash_table_iter      hti;
-    struct symt_ht*             sym;
-    regex_t                     re;
-    struct line_info*           dli;
-    void*                       ptr;
-    SRCCODEINFO                 sci;
-    const char*                 file;
-
-    if (!cb) return FALSE;
-    if (!(dbghelp_options & SYMOPT_LOAD_LINES)) return TRUE;
-
-    pair.pcs = process_find_by_handle(hProcess);
-    if (!pair.pcs) return FALSE;
-    if (compiland) FIXME("Unsupported yet (filtering on compiland %s)\n", compiland);
-    pair.requested = module_find_by_addr(pair.pcs, base, DMT_UNKNOWN);
-    if (!module_get_debug(&pair)) return FALSE;
-    if (!compile_regex(&re, srcfile)) return FALSE;
-
-    sci.SizeOfStruct = sizeof(sci);
-    sci.ModBase      = base;
-
-    hash_table_iter_init(&pair.effective->ht_symbols, &hti, NULL);
-    while ((ptr = hash_table_iter_up(&hti)))
-    {
-        unsigned int    i;
-
-        sym = GET_ENTRY(ptr, struct symt_ht, hash_elt);
-        if (sym->symt.tag != SymTagFunction) continue;
-
-        sci.FileName[0] = '\0';
-        for (i=0; i<vector_length(&((struct symt_function*)sym)->vlines); i++)
-        {
-            dli = vector_at(&((struct symt_function*)sym)->vlines, i);
-            if (dli->is_source_file)
-            {
-                file = source_get(pair.effective, dli->u.source_file);
-                if (regexec(&re, file, 0, NULL, 0) != 0) file = "";
-                strcpy(sci.FileName, file);
-            }
-            else if (sci.FileName[0])
-            {
-                sci.Key = dli;
-                sci.Obj[0] = '\0'; /* FIXME */
-                sci.LineNumber = dli->line_number;
-                sci.Address = dli->u.pc_offset;
-                if (!cb(&sci, user)) break;
-            }
-        }
-    }
-    regfree(&re);
-    return TRUE;
-}
-
 /******************************************************************
  *		SymGetSourceFileToken (DBGHELP.@)
  *
diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c
index 304e075..9e66f00 100644
--- a/dlls/dbghelp/symbol.c
+++ b/dlls/dbghelp/symbol.c
@@ -123,6 +123,48 @@ static void compile_regex(const char* str, int numchar, regex_t* re, BOOL _case)
     HeapFree(GetProcessHeap(), 0, mask);
 }
 
+static BOOL compile_file_regex(regex_t* re, const char* srcfile)
+{
+    char *mask, *p;
+    BOOL ret;
+
+    p = mask = HeapAlloc(GetProcessHeap(), 0, 5 * strlen(srcfile) + 4);
+    *p++ = '^';
+    if (!srcfile || !*srcfile) *p++ = '*';
+    else while (*srcfile)
+    {
+        switch (*srcfile)
+        {
+        case '\\':
+        case '/':
+            *p++ = '[';
+            *p++ = '\\';
+            *p++ = '\\';
+            *p++ = '/';
+            *p++ = ']';
+            break;
+        case '.':
+            *p++ = '\\';
+            *p++ = '.';
+            break;
+        default:
+            *p++ = *srcfile;
+            break;
+        }
+        srcfile++;
+    }
+    *p++ = '$';
+    *p = 0;
+    ret = !regcomp(re, mask, REG_NOSUB);
+    HeapFree(GetProcessHeap(), 0, mask);
+    if (!ret)
+    {
+        FIXME("Couldn't compile %s\n", mask);
+        SetLastError(ERROR_INVALID_PARAMETER);
+    }
+    return ret;
+}
+
 static int match_regexp( const regex_t *re, const char *str )
 {
     return !regexec( re, str, 0, NULL, 0 );
@@ -148,6 +190,12 @@ static void compile_regex(const char* str, int numchar, regex_t* re, BOOL _case)
     re->icase = _case;
 }
 
+static BOOL compile_file_regex(regex_t* re, const char* srcfile)
+{
+    compile_regex( srcfile, -1, re, FALSE );
+    return TRUE;
+}
+
 static int match_regexp( const regex_t *re, const char *str )
 {
     if (re->icase) return !lstrcmpiA( re->str, str );
@@ -1797,3 +1845,64 @@ BOOL WINAPI SymSetScopeFromAddr(HANDLE hProcess, ULONG64 addr)
     if (!(pcs = process_find_by_handle(hProcess))) return FALSE;
     return TRUE;
 }
+
+/******************************************************************
+ *		SymEnumLines (DBGHELP.@)
+ *
+ */
+BOOL WINAPI SymEnumLines(HANDLE hProcess, ULONG64 base, PCSTR compiland,
+                         PCSTR srcfile, PSYM_ENUMLINES_CALLBACK cb, PVOID user)
+{
+    struct module_pair          pair;
+    struct hash_table_iter      hti;
+    struct symt_ht*             sym;
+    regex_t                     re;
+    struct line_info*           dli;
+    void*                       ptr;
+    SRCCODEINFO                 sci;
+    const char*                 file;
+
+    if (!cb) return FALSE;
+    if (!(dbghelp_options & SYMOPT_LOAD_LINES)) return TRUE;
+
+    pair.pcs = process_find_by_handle(hProcess);
+    if (!pair.pcs) return FALSE;
+    if (compiland) FIXME("Unsupported yet (filtering on compiland %s)\n", compiland);
+    pair.requested = module_find_by_addr(pair.pcs, base, DMT_UNKNOWN);
+    if (!module_get_debug(&pair)) return FALSE;
+    if (!compile_file_regex(&re, srcfile)) return FALSE;
+
+    sci.SizeOfStruct = sizeof(sci);
+    sci.ModBase      = base;
+
+    hash_table_iter_init(&pair.effective->ht_symbols, &hti, NULL);
+    while ((ptr = hash_table_iter_up(&hti)))
+    {
+        unsigned int    i;
+
+        sym = GET_ENTRY(ptr, struct symt_ht, hash_elt);
+        if (sym->symt.tag != SymTagFunction) continue;
+
+        sci.FileName[0] = '\0';
+        for (i=0; i<vector_length(&((struct symt_function*)sym)->vlines); i++)
+        {
+            dli = vector_at(&((struct symt_function*)sym)->vlines, i);
+            if (dli->is_source_file)
+            {
+                file = source_get(pair.effective, dli->u.source_file);
+                if (!match_regexp(&re, file)) file = "";
+                strcpy(sci.FileName, file);
+            }
+            else if (sci.FileName[0])
+            {
+                sci.Key = dli;
+                sci.Obj[0] = '\0'; /* FIXME */
+                sci.LineNumber = dli->line_number;
+                sci.Address = dli->u.pc_offset;
+                if (!cb(&sci, user)) break;
+            }
+        }
+    }
+    regfree(&re);
+    return TRUE;
+}




More information about the wine-cvs mailing list