X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=tools%2Fprotoparse.h;h=7b449be63d0aefbfee2069aa928097acdce5ff0f;hb=ee554c95296119b6b8d82856fbb09ffb8c9dc419;hp=28941285bcad6c25aba33ef7753604b84a1a79ad;hpb=8c83cc48a2090b018cb39a629454b5e9608ba4d8;p=ia32rtools.git diff --git a/tools/protoparse.h b/tools/protoparse.h index 2894128..7b449be 100644 --- a/tools/protoparse.h +++ b/tools/protoparse.h @@ -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 { @@ -40,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 @@ -192,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.. @@ -210,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", @@ -389,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); @@ -449,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", @@ -512,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", @@ -659,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); @@ -861,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);