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 {
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
"HRSRC",
"HKEY",
"HMENU",
+ "HMONITOR",
"HWAVEOUT",
"HWND",
+ "PAPPBARDATA",
"PBYTE",
"PCRITICAL_SECTION",
+ "PDEVMODEA",
"PDWORD",
"PFILETIME",
"PLARGE_INTEGER",
"PCVOID",
"PWORD",
"REFCLSID",
+ "REFGUID",
"REFIID",
+ "SC_HANDLE",
+ "SERVICE_STATUS_HANDLE",
"HOOKPROC",
"DLGPROC",
"TIMERPROC",
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);
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",
pp->has_retreg |= is_retreg;
}
+ 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")))
{