X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=tools%2Fprotoparse.h;h=c5853066cc5c0f29c2c7d5b1c04222fdb3caab29;hb=da87ae3856e51856fde9bd24ccf32ecdf6ca39d8;hp=c560d50a1eae41bf4ad802f89210490d57258f51;hpb=cdfaeed73d8ca19b644a96767471fdfa00e430b1;p=ia32rtools.git diff --git a/tools/protoparse.h b/tools/protoparse.h index c560d50..c585306 100644 --- a/tools/protoparse.h +++ b/tools/protoparse.h @@ -30,6 +30,7 @@ struct parsed_proto { 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; }; @@ -46,6 +47,8 @@ static int do_protostrs(FILE *fhdr, const char *fname) 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; @@ -63,10 +66,19 @@ static int do_protostrs(FILE *fhdr, const char *fname) 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); @@ -128,6 +140,7 @@ static const char *known_type_mod[] = { }; static const char *known_ptr_types[] = { + "FARPROC", "HACCEL", "HANDLE", "HBITMAP", @@ -136,15 +149,22 @@ static const char *known_ptr_types[] = { "HFONT", "HGDIOBJ", "HGLOBAL", + "HICON", "HINSTANCE", + //"HIMC", // DWORD "HMODULE", + "HPALETTE", "HRGN", "HRSRC", "HKEY", "HMENU", "HWND", - "PLONG", + "PCRITICAL_SECTION", "PDWORD", + "PHKEY", + "PLONG", + "PMEMORY_BASIC_INFORMATION", + "PUINT", "PVOID", "PCVOID", "DLGPROC", @@ -235,6 +255,9 @@ static int check_type(const char *name, struct parsed_type *type) ret = n1 - name; type->name = strndup(name, ret); + if (IS(type->name, "VOID")) + memcpy(type->name, "void", 4); + return ret; } @@ -308,6 +331,11 @@ static int parse_protostr(char *protostr, struct parsed_proto *pp) } 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); @@ -593,7 +621,8 @@ static void build_pp_cache(FILE *fhdr) qsort(pp_cache, pp_cache_size, sizeof(pp_cache[0]), pp_name_cmp); } -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; @@ -607,7 +636,7 @@ static const struct parsed_proto *proto_parse(FILE *fhdr, const char *sym) 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;