winedump: selective search also by name

Jan Kratochvil short at ucw.cz
Mon Sep 16 03:16:09 CDT 2002


Hi, 

On Mon, 16 Sep 2002 00:44:41 +0200, Jan Kratochvil wrote:
...
> Just a minor improvement to be able to provide with a list of function names
> to generate. New -S: Search only prototype names found in 'symfile'.
> Similiar to -s/-e (Start/End prototype search after symbol 'num'}.
> 
> Commit requested if approved as I have no CVS commit access.
> 
> I am missing some general utility library such as GLib, Qt, NSPR or APR to
> provide general datastructures such as hashes etc. Maybe it is provided by W32?
> Therefore /* FIXME: Replace with some hash such as GHashTable */.

Sorry, updated as there was minor bug (didn't appear during my test before).

wine-winedump-symfile-symfile2.diff - difference of this updated patch, just FYI
wine-winedump-symfile.diff          - updated patch itself



Jan Kratochvil
-------------- next part --------------
--- wine-winedump-symfile.diff	Mon Sep 16 00:30:22 2002
+++ wine-winedump-symfile2.diff	Mon Sep 16 10:12:47 2002
@@ -91,7 +91,6 @@
 +            started = 1;
 +        }
 +        printf("\t%s\n",search_symbol->symbolname);
-+        return 1;
 +    }
 +    return started;
 +}
-------------- next part --------------
Index: main.c
===================================================================
RCS file: /home/wine/wine/tools/winedump/main.c,v
retrieving revision 1.9
diff -u -r1.9 main.c
--- main.c	26 Aug 2002 21:47:41 -0000	1.9
+++ main.c	15 Sep 2002 22:28:47 -0000
@@ -124,6 +124,30 @@
 }
 
 
+static void do_symfile (const char *arg)
+{
+  FILE *f;
+  char symstring[256];    /* keep count with "%<width>s" below */
+  search_symbol *symbolp,**symbolptail = &globals.search_symbol;
+
+  if (!(f = fopen(arg, "rt")))
+    fatal ("Cannot open <symfile>");
+  while (1 == fscanf(f, "%255s", symstring))    /* keep count with [<width>] above */
+  {
+    symstring[sizeof(symstring)-1] = '\0';
+    if (!(symbolp = malloc(sizeof(*symbolp) + strlen(symstring))))
+      fatal ("Out of memory");
+    strcpy(symbolp->symbolname, symstring);
+    symbolp->found = 0;
+    symbolp->next = NULL;
+    *symbolptail = symbolp;
+    symbolptail = &symbolp->next;
+  }
+  if (fclose(f))
+    fatal ("Cannot close <symfile>");
+}
+
+
 static void do_verbose (void)
 {
   globals.do_verbose = 1;
@@ -173,6 +197,7 @@
   {"-C",    SPEC, 0, do_cdecl,    "-C           Assume __cdecl calls (default: __stdcall)"},
   {"-s",    SPEC, 1, do_start,    "-s num       Start prototype search after symbol 'num'"},
   {"-e",    SPEC, 1, do_end,      "-e num       End prototype search after symbol 'num'"},
+  {"-S",    SPEC, 1, do_symfile,  "-S symfile   Search only prototype names found in 'symfile'"},
   {"-q",    SPEC, 0, do_quiet,    "-q           Don't show progress (quiet)."},
   {"-v",    SPEC, 0, do_verbose,  "-v           Show lots of detail while working (verbose)."},
   {"dump",  DUMP, 0, do_dump,     "dump <mod>   Dumps the content of the module (dll, exe...) named <mod>"},
@@ -290,6 +315,54 @@
     OUTPUT_UC_DLL_NAME = (setUC) ? str_toupper( strdup (OUTPUT_DLL_NAME)) : "";
 }
 
+/* Marks the symbol as 'found'! */
+/* return: perform-search */
+static int symbol_searched(int count, const char *symbolname)
+{
+    search_symbol *search_symbol;
+
+    if (!(count >= globals.start_ordinal
+          && (!globals.end_ordinal || count <= globals.end_ordinal)))
+        return 0;
+    if (!globals.search_symbol)
+        return 1;
+    for (search_symbol = globals.search_symbol;
+         search_symbol;
+         search_symbol = search_symbol->next)
+    {
+        if (!strcmp(symbolname, search_symbol->symbolname))
+        {
+            search_symbol->found = 1;
+            return 1;
+        }
+    }
+    return 0;
+}
+
+/* return: some symbols weren't found */
+static int symbol_finish(void)
+{
+    const search_symbol *search_symbol;
+    int started = 0;
+
+    for (search_symbol = globals.search_symbol;
+         search_symbol;
+         search_symbol = search_symbol->next)
+    {
+        if (search_symbol->found)
+            continue;
+        if (!started)
+        {
+            /* stderr? not a practice here */
+            puts("These requested <symfile> symbols weren't found:");
+            started = 1;
+        }
+        printf("\t%s\n",search_symbol->symbolname);
+        return 1;
+    }
+    return started;
+}
+
 /*******************************************************************
  *         main
  */
@@ -344,8 +417,7 @@
 		printf ("Export %3d - '%s' ...%c", count, symbol.symbol,
 			VERBOSE ? '\n' : ' ');
 
-	    if (globals.do_code && count >= globals.start_ordinal
-		&& (!globals.end_ordinal || count <= globals.end_ordinal))
+	    if (globals.do_code && symbol_searched(count, symbol.symbol))
 	    {
 		/* Attempt to get information about the symbol */
 		int result = symbol_demangle (&symbol);
@@ -375,6 +447,8 @@
 
 	if (VERBOSE)
 	    puts ("Finished, Cleaning up...");
+        if (symbol_finish())
+            return 1;
 	break;
     case NONE:
 	do_usage();
Index: winedump.h
===================================================================
RCS file: /home/wine/wine/tools/winedump/winedump.h,v
retrieving revision 1.5
diff -u -r1.5 winedump.h
--- winedump.h	31 May 2002 23:41:00 -0000	1.5
+++ winedump.h	15 Sep 2002 22:28:48 -0000
@@ -91,6 +91,14 @@
   char *arg_name [MAX_FUNCTION_ARGS];
 } parsed_symbol;
 
+/* FIXME: Replace with some hash such as GHashTable */
+typedef struct __search_symbol
+{
+  struct __search_symbol *next;
+  int found;
+  char symbolname[1];    /* static string, be ANSI C compliant by [1] */
+} search_symbol;
+
 /* All globals */
 typedef struct __globals
 {
@@ -117,6 +125,7 @@
   /* Option arguments: spec mode */
   int   start_ordinal;     /* -s */
   int   end_ordinal;       /* -e */
+  search_symbol *search_symbol; /* -S */
   const char *directory;   /* -I */
   const char *forward_dll; /* -f */
   const char *dll_name;    /* -o */


More information about the wine-patches mailing list