X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=tools%2Fprotoparse.h;h=3981588e7b1139c9a3162a63c1baf02948d810cb;hb=1f906263984019d6804c760d7ca6f8c162c5b78d;hp=54add08219dab7c457a533dfe1d129cd5e74b39e;hpb=94d447fbb6ab6c7c01b3734457920a648292ddc5;p=ia32rtools.git diff --git a/tools/protoparse.h b/tools/protoparse.h index 54add08..3981588 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,16 +149,22 @@ static const char *known_ptr_types[] = { "HFONT", "HGDIOBJ", "HGLOBAL", + "HICON", "HINSTANCE", + //"HIMC", // DWORD "HMODULE", + "HPALETTE", "HRGN", "HRSRC", "HKEY", "HMENU", "HWND", + "PCRITICAL_SECTION", "PDWORD", "PHKEY", "PLONG", + "PMEMORY_BASIC_INFORMATION", + "PUINT", "PVOID", "PCVOID", "DLGPROC", @@ -236,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; } @@ -309,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); @@ -583,8 +610,10 @@ static int b_pp_c_handler(char *proto, const char *fname) static void build_pp_cache(FILE *fhdr) { + long pos; int ret; + pos = ftell(fhdr); rewind(fhdr); ret = do_protostrs(fhdr, hdrfn); @@ -592,9 +621,11 @@ static void build_pp_cache(FILE *fhdr) 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; @@ -608,7 +639,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;