X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=ia32rtools.git;a=blobdiff_plain;f=tools%2Fprotoparse.h;h=3d70d8658dfc1988e14a659bf851c38ffa6b7dd1;hp=26b0e0048cd5728b442df0ae3c64b9e8ab6302bb;hb=61e29183dd00fa64584fa8787008b21a1c70b8ce;hpb=c7ed83dd918585832e3c9001dabdb7375518d635 diff --git a/tools/protoparse.h b/tools/protoparse.h index 26b0e00..3d70d86 100644 --- a/tools/protoparse.h +++ b/tools/protoparse.h @@ -1,3 +1,10 @@ +/* + * ia32rtools + * (C) notaz, 2013,2014 + * + * This work is licensed under the terms of 3-clause BSD license. + * See COPYING file in the top-level directory. + */ struct parsed_proto; @@ -6,7 +13,8 @@ struct parsed_type { unsigned int is_array:1; unsigned int is_ptr:1; unsigned int is_struct:1; // split for args - unsigned int is_retreg:1; // register to return + unsigned int is_retreg:1; // register to return to caller + unsigned int is_va_list:1; }; struct parsed_proto_arg { @@ -34,7 +42,9 @@ struct parsed_proto { unsigned int is_noreturn:1; unsigned int is_unresolved:1; unsigned int is_userstack:1; - unsigned int is_arg:1; // decl in func arg + unsigned int is_include:1; // not from top-level header + unsigned int is_osinc:1; // OS/system library func + unsigned int is_arg:1; // declared in some func arg unsigned int has_structarg:1; unsigned int has_retreg:1; }; @@ -45,15 +55,17 @@ static int hdrfline = 0; static void pp_copy_arg(struct parsed_proto_arg *d, const struct parsed_proto_arg *s); -static int b_pp_c_handler(char *proto, const char *fname); +static int b_pp_c_handler(char *proto, const char *fname, + int is_include, int is_osinc); -static int do_protostrs(FILE *fhdr, const char *fname) +static int do_protostrs(FILE *fhdr, const char *fname, int is_include) { const char *finc_name; const char *hdrfn_saved; char protostr[256]; char path[256]; char fname_inc[256]; + int is_osinc; FILE *finc; int line = 0; int ret; @@ -62,6 +74,9 @@ static int do_protostrs(FILE *fhdr, const char *fname) hdrfn_saved = hdrfn; hdrfn = fname; + is_osinc = strstr(fname, "stdc.hlist") + || strstr(fname, "win32.hlist"); + while (fgets(protostr, sizeof(protostr), fhdr)) { line++; @@ -86,7 +101,7 @@ static int do_protostrs(FILE *fhdr, const char *fname) fname_inc, line, finc_name); continue; } - ret = do_protostrs(finc, finc_name); + ret = do_protostrs(finc, finc_name, 1); fclose(finc); if (ret < 0) break; @@ -103,7 +118,8 @@ static int do_protostrs(FILE *fhdr, const char *fname) hdrfline = line; - ret = b_pp_c_handler(protostr, hdrfn); + ret = b_pp_c_handler(protostr, hdrfn, is_include, + is_osinc); if (ret < 0) break; } @@ -156,9 +172,11 @@ static const char *known_type_mod[] = { static const char *known_ptr_types[] = { "FARPROC", "WNDPROC", + "LINECALLBACK", "HACCEL", "HANDLE", "HBITMAP", + "HCALL", "HCURSOR", "HDC", "HFONT", @@ -167,6 +185,9 @@ static const char *known_ptr_types[] = { "HICON", "HINSTANCE", "HIMC", // DWORD in mingw, ptr in wine.. + "HLINE", + "HLINEAPP", + "HLOCAL", "HMODULE", "HPALETTE", "HRGN", @@ -179,6 +200,7 @@ static const char *known_ptr_types[] = { "PCRITICAL_SECTION", "PDWORD", "PFILETIME", + "PLARGE_INTEGER", "PHKEY", "PLONG", "PMEMORY_BASIC_INFORMATION", @@ -274,6 +296,8 @@ static int check_type(const char *name, struct parsed_type *type) ret = n1 - name; type->name = strndup(name, ret); + if (IS(type->name, "__VALIST") || IS(type->name, "va_list")) + type->is_va_list = 1; if (IS(type->name, "VOID")) memcpy(type->name, "void", 4); @@ -640,7 +664,8 @@ static struct parsed_proto *pp_cache; static int pp_cache_size; static int pp_cache_alloc; -static int b_pp_c_handler(char *proto, const char *fname) +static int b_pp_c_handler(char *proto, const char *fname, + int is_include, int is_osinc) { int ret; @@ -658,6 +683,8 @@ static int b_pp_c_handler(char *proto, const char *fname) if (ret < 0) return -1; + pp_cache[pp_cache_size].is_include = is_include; + pp_cache[pp_cache_size].is_osinc = is_osinc; pp_cache_size++; return 0; } @@ -670,7 +697,7 @@ static void build_pp_cache(FILE *fhdr) pos = ftell(fhdr); rewind(fhdr); - ret = do_protostrs(fhdr, hdrfn); + ret = do_protostrs(fhdr, hdrfn, 0); if (ret < 0) exit(1); @@ -742,6 +769,30 @@ struct parsed_proto *proto_clone(const struct parsed_proto *pp_c) return pp; } + +static inline int pp_cmp_func(const struct parsed_proto *pp1, + const struct parsed_proto *pp2) +{ + int i; + + if (pp1->argc != pp2->argc || pp1->argc_reg != pp2->argc_reg) + return 1; + else { + for (i = 0; i < pp1->argc; i++) { + if ((pp1->arg[i].reg != NULL) != (pp2->arg[i].reg != NULL)) + return 1; + + if ((pp1->arg[i].reg != NULL) + && !IS(pp1->arg[i].reg, pp2->arg[i].reg)) + { + return 1; + } + } + } + + return 0; +} + static inline void pp_print(char *buf, size_t buf_size, const struct parsed_proto *pp) {