fixes, standalone version builds
[ia32rtools.git] / tools / protoparse.h
index ec9d4ad..3981588 100644 (file)
@@ -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);
@@ -124,9 +136,11 @@ static const char *known_type_mod[] = {
        "unsigned",
        "struct",
        "enum",
+       "CONST",
 };
 
 static const char *known_ptr_types[] = {
+       "FARPROC",
        "HACCEL",
        "HANDLE",
        "HBITMAP",
@@ -135,18 +149,27 @@ 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",
+       "TIMERPROC",
+       "WNDENUMPROC",
        "va_list",
        "__VALIST",
 };
@@ -232,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;
 }
 
@@ -305,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);
@@ -431,8 +462,14 @@ static int parse_protostr(char *protostr, struct parsed_proto *pp)
                        p++;
                        break;
                }
-               if (*p == ',')
+               if (xarg > 0) {
+                       if (*p != ',') {
+                               printf("%s:%d:%zd: ',' expected\n",
+                                hdrfn, hdrfline, (p - protostr) + 1);
+                               return -1;
+                       }
                        p = sskip(p + 1);
+               }
 
                if (!strncmp(p, "...", 3)) {
                        pp->is_vararg = 1;
@@ -573,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);
@@ -582,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;
@@ -598,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;