unsigned int is_vararg:1;
unsigned int is_fptr:1;
unsigned int is_noreturn:1;
+ unsigned int is_unresolved:1;
unsigned int has_structarg:1;
};
const char *finc_name;
const char *hdrfn_saved;
char protostr[256];
+ char path[256];
+ char fname_inc[256];
FILE *finc;
int line = 0;
int ret;
if (p != NULL)
*p = 0;
- finc = fopen(finc_name, "r");
+ path[0] = 0;
+ p = strrchr(hdrfn_saved, '/');
+ if (p) {
+ memcpy(path, hdrfn_saved,
+ p - hdrfn_saved + 1);
+ path[p - hdrfn_saved + 1] = 0;
+ }
+ snprintf(fname_inc, sizeof(fname_inc), "%s%s",
+ path, finc_name);
+ finc = fopen(fname_inc, "r");
if (finc == NULL) {
printf("%s:%d: can't open '%s'\n",
- fname, line, finc_name);
+ fname_inc, line, finc_name);
continue;
}
ret = do_protostrs(finc, finc_name);
};
static const char *known_ptr_types[] = {
+ "FARPROC",
"HACCEL",
"HANDLE",
"HBITMAP",
"HFONT",
"HGDIOBJ",
"HGLOBAL",
+ "HICON",
"HINSTANCE",
- "HIMC",
+ //"HIMC", // DWORD
"HMODULE",
+ "HPALETTE",
"HRGN",
"HRSRC",
"HKEY",
}
p = sskip(p + ret);
+ if (!strncmp(p, "noreturn ", 9)) {
+ pp->is_noreturn = 1;
+ p = sskip(p + 9);
+ }
+
if (!strchr(p, ')')) {
p = next_idt(buf, sizeof(buf), p);
p = sskip(p);
static void build_pp_cache(FILE *fhdr)
{
+ long pos;
int ret;
+ pos = ftell(fhdr);
rewind(fhdr);
ret = do_protostrs(fhdr, hdrfn);
exit(1);
qsort(pp_cache, pp_cache_size, sizeof(pp_cache[0]), pp_name_cmp);
+ fseek(fhdr, pos, SEEK_SET);
}
-static const struct parsed_proto *proto_parse(FILE *fhdr, const char *sym)
+static const struct parsed_proto *proto_parse(FILE *fhdr, const char *sym,
+ int quiet)
{
const struct parsed_proto *pp_ret;
struct parsed_proto pp_search;
strcpy(pp_search.name, sym);
pp_ret = bsearch(&pp_search, pp_cache, pp_cache_size,
sizeof(pp_cache[0]), pp_name_cmp);
- if (pp_ret == NULL)
+ if (pp_ret == NULL && !quiet)
printf("%s: sym '%s' is missing\n", hdrfn, sym);
return pp_ret;