minor fixes, winsvc api
[ia32rtools.git] / tools / protoparse.h
index 469c12f..7b449be 100644 (file)
@@ -15,6 +15,8 @@ struct parsed_type {
        unsigned int is_struct:1; // split for args
        unsigned int is_retreg:1; // register to return to caller
        unsigned int is_va_list:1;
+       unsigned int is_64bit:1;
+       unsigned int is_float:1;  // float, double
 };
 
 struct parsed_proto_arg {
@@ -22,6 +24,7 @@ struct parsed_proto_arg {
        struct parsed_type type;
        struct parsed_proto *pp; // fptr or struct
        void *datap;
+       unsigned int is_saved:1; // not set here, for tool use
 };
 
 struct parsed_proto {
@@ -39,8 +42,10 @@ struct parsed_proto {
        unsigned int is_fastcall:1;
        unsigned int is_vararg:1;     // vararg func
        unsigned int is_fptr:1;
+       unsigned int is_import:1;     // data import
        unsigned int is_noreturn:1;
        unsigned int is_unresolved:1;
+       unsigned int is_guessed:1;    // for extra checking
        unsigned int is_userstack:1;
        unsigned int is_include:1;    // not from top-level header
        unsigned int is_osinc:1;      // OS/system library func
@@ -191,12 +196,14 @@ static const char *known_ptr_types[] = {
        "HACCEL",
        "HANDLE",
        "HBITMAP",
+       "HBRUSH",
        "HCALL",
        "HCURSOR",
        "HDC",
        "HFONT",
        "HGDIOBJ",
        "HGLOBAL",
+       "HHOOK",
        "HICON",
        "HINSTANCE",
        "HIMC", // DWORD in mingw, ptr in wine..
@@ -209,20 +216,32 @@ static const char *known_ptr_types[] = {
        "HRSRC",
        "HKEY",
        "HMENU",
+       "HMONITOR",
        "HWAVEOUT",
        "HWND",
+       "PAPPBARDATA",
        "PBYTE",
        "PCRITICAL_SECTION",
+       "PDEVMODEA",
        "PDWORD",
        "PFILETIME",
        "PLARGE_INTEGER",
+       "PHANDLE",
        "PHKEY",
        "PLONG",
        "PMEMORY_BASIC_INFORMATION",
        "PUINT",
+       "PULARGE_INTEGER",
+       "PULONG_PTR",
        "PVOID",
        "PCVOID",
        "PWORD",
+       "REFCLSID",
+       "REFGUID",
+       "REFIID",
+       "SC_HANDLE",
+       "SERVICE_STATUS_HANDLE",
+       "HOOKPROC",
        "DLGPROC",
        "TIMERPROC",
        "WNDENUMPROC",
@@ -388,6 +407,9 @@ static int parse_arg(char **p_, struct parsed_proto_arg *arg, int xarg)
        if (ret < 0)
                return -1;
 
+       if (IS_START(arg->pp->name, "guess"))
+               arg->pp->is_guessed = 1;
+
        // we don't use actual names right now...
        snprintf(arg->pp->name, sizeof(arg->pp->name), "a%d", xarg);
 
@@ -448,6 +470,11 @@ static int parse_protostr(char *protostr, struct parsed_proto *pp)
                        p = sskip(p + l + 1);
        }
 
+       if (IS_START(p, "DECL_IMPORT ")) {
+               pp->is_import = 1;
+               p = sskip(p + 12);
+       }
+
        ret = check_type(p, &pp->ret_type);
        if (ret <= 0) {
                printf("%s:%d:%zd: unhandled return in '%s'\n",
@@ -511,7 +538,7 @@ static int parse_protostr(char *protostr, struct parsed_proto *pp)
                pp->is_stdcall = 0; // custom
                pp->is_userstack = 1;
        }
-       else if (IS(cconv, "WINAPI"))
+       else if (IS(cconv, "WINAPI") || IS(cconv, "PASCAL"))
                pp->is_stdcall = 1;
        else {
                printf("%s:%d:%zd: unhandled cconv: '%s'\n",
@@ -658,14 +685,22 @@ static int parse_protostr(char *protostr, struct parsed_proto *pp)
                        pp->has_retreg |= is_retreg;
                }
 
-               if (strstr(arg->type.name, "int64")
-                   || IS(arg->type.name, "double"))
+               if (IS(arg->type.name, "float")
+                     || IS(arg->type.name, "double"))
                {
+                       arg->type.is_float = 1;
+               }
+
+               if (!arg->type.is_ptr && (strstr(arg->type.name, "int64")
+                     || IS(arg->type.name, "double")))
+               {
+                       arg->type.is_64bit = 1;
                        // hack..
-                       free(arg->type.name);
-                       arg->type.name = strdup("int");
                        pp_copy_arg(&pp->arg[xarg], arg);
+                       arg = &pp->arg[xarg];
                        xarg++;
+                       free(arg->type.name);
+                       arg->type.name = strdup("dummy");
                }
 
                ret = check_struct_arg(arg);
@@ -860,7 +895,8 @@ static const struct parsed_proto *proto_parse(FILE *fhdr, const char *sym,
        if (pp_cache == NULL)
                build_caches(fhdr);
 
-       if (sym[0] == '_') // && strncmp(fname, "stdc", 4) == 0)
+       // ugh...
+       if (sym[0] == '_' && !IS_START(sym, "__W"))
                sym++;
 
        strcpy(pp_search.name, sym);