translate: handle various cases from smacker
[ia32rtools.git] / tools / protoparse.h
index ab16632..d58bf83 100644 (file)
@@ -28,10 +28,11 @@ struct parsed_proto {
        unsigned int is_func:1;
        unsigned int is_stdcall:1;
        unsigned int is_fastcall:1;
-       unsigned int is_vararg:1;
+       unsigned int is_vararg:1;     // vararg func
        unsigned int is_fptr:1;
        unsigned int is_noreturn:1;
        unsigned int is_unresolved:1;
+       unsigned int is_arg:1;        // decl in func arg
        unsigned int has_structarg:1;
 };
 
@@ -161,7 +162,9 @@ static const char *known_ptr_types[] = {
        "HRSRC",
        "HKEY",
        "HMENU",
+       "HWAVEOUT",
        "HWND",
+       "PBYTE",
        "PCRITICAL_SECTION",
        "PDWORD",
        "PFILETIME",
@@ -171,6 +174,7 @@ static const char *known_ptr_types[] = {
        "PUINT",
        "PVOID",
        "PCVOID",
+       "PWORD",
        "DLGPROC",
        "TIMERPROC",
        "WNDENUMPROC",
@@ -510,6 +514,10 @@ static int parse_protostr(char *protostr, struct parsed_proto *pp)
                                        hdrfn, hdrfline, p1 - protostr);
                                return -1;
                        }
+                       arg->fptr->is_arg = 1;
+                       // we don't use actual names right now..
+                       snprintf(arg->fptr->name,
+                               sizeof(arg->fptr->name), "a%d", xarg);
                        // we'll treat it as void * for non-calls
                        arg->type.name = strdup("void *");
                        arg->type.is_ptr = 1;
@@ -657,6 +665,7 @@ static const struct parsed_proto *proto_parse(FILE *fhdr, const char *sym,
 {
        const struct parsed_proto *pp_ret;
        struct parsed_proto pp_search;
+       char *p;
 
        if (pp_cache == NULL)
                build_pp_cache(fhdr);
@@ -665,6 +674,10 @@ static const struct parsed_proto *proto_parse(FILE *fhdr, const char *sym,
                sym++;
 
        strcpy(pp_search.name, sym);
+       p = strchr(pp_search.name, '@');
+       if (p != NULL)
+               *p = 0;
+
        pp_ret = bsearch(&pp_search, pp_cache, pp_cache_size,
                        sizeof(pp_cache[0]), pp_name_cmp);
        if (pp_ret == NULL && !quiet)