translate: improve arg collect
[ia32rtools.git] / tools / protoparse.h
index 1bc619c..a34d1a6 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,8 @@ 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_oslib: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,7 +54,7 @@ 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_oslib);
 
 static int do_protostrs(FILE *fhdr, const char *fname)
 {
@@ -54,6 +63,7 @@ static int do_protostrs(FILE *fhdr, const char *fname)
        char protostr[256];
        char path[256];
        char fname_inc[256];
+       int is_oslib;
        FILE *finc;
        int line = 0;
        int ret;
@@ -62,6 +72,9 @@ static int do_protostrs(FILE *fhdr, const char *fname)
        hdrfn_saved = hdrfn;
        hdrfn = fname;
 
+       is_oslib = strstr(fname, "stdc.hlist")
+                || strstr(fname, "win32.hlist");
+
        while (fgets(protostr, sizeof(protostr), fhdr))
        {
                line++;
@@ -103,7 +116,7 @@ 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_oslib);
                if (ret < 0)
                        break;
        }
@@ -280,6 +293,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);
 
@@ -646,7 +661,7 @@ 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_oslib)
 {
        int ret;
 
@@ -664,6 +679,7 @@ static int b_pp_c_handler(char *proto, const char *fname)
        if (ret < 0)
                return -1;
 
+       pp_cache[pp_cache_size].is_oslib = is_oslib;
        pp_cache_size++;
        return 0;
 }