translate: hdrgen: detect strings, skip std funcs
[ia32rtools.git] / tools / protoparse.h
index 037c3f4..3d70d86 100644 (file)
@@ -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);