fixes, standalone works?
[ia32rtools.git] / tools / cvt_data.c
index 7779287..bddd6ef 100644 (file)
@@ -205,28 +205,6 @@ static char *escape_string(char *s)
   return strcpy(s, buf);
 }
 
-static void sprint_pp(const struct parsed_proto *pp, char *buf,
-  size_t buf_size)
-{
-  size_t l;
-  int i;
-
-  snprintf(buf, buf_size, "%s %s(", pp->ret_type.name, pp->name);
-  l = strlen(buf);
-
-  for (i = 0; i < pp->argc_reg; i++) {
-    snprintf(buf + l, buf_size - l, "%s%s",
-      i == 0 ? "" : ", ", pp->arg[i].reg);
-    l = strlen(buf);
-  }
-  if (pp->argc_stack > 0) {
-    snprintf(buf + l, buf_size - l, "%s{%d stack}",
-      i == 0 ? "" : ", ", pp->argc_stack);
-    l = strlen(buf);
-  }
-  snprintf(buf + l, buf_size - l, ")");
-}
-
 static void sprint_pp_short(const struct parsed_proto *pp, char *buf,
   size_t buf_size)
 {
@@ -255,7 +233,8 @@ static void sprint_pp_short(const struct parsed_proto *pp, char *buf,
   snprintf(buf + l, buf_size - l, ")");
 }
 
-static void check_var(FILE *fhdr, const char *sym, const char *varname)
+static const struct parsed_proto *check_var(FILE *fhdr,
+  const char *sym, const char *varname)
 {
   const struct parsed_proto *pp, *pp_sym;
   char fp_sym[256], fp_var[256];
@@ -265,13 +244,13 @@ static void check_var(FILE *fhdr, const char *sym, const char *varname)
   if (pp == NULL) {
     if (IS_START(varname, "sub_"))
       awarn("sub_ sym missing proto: '%s'\n", varname);
-    return;
+    return NULL;
   }
 
   if (!pp->is_func && !pp->is_fptr)
-    return;
+    return NULL;
 
-  sprint_pp(pp, fp_var, sizeof(fp_var));
+  pp_print(fp_var, sizeof(fp_var), pp);
 
   if (pp->argc_reg == 0)
     goto check_sym;
@@ -294,7 +273,7 @@ check_sym:
     g_func_sym_pp = NULL;
     pp_sym = proto_parse(fhdr, sym, 1);
     if (pp_sym == NULL)
-      return;
+      return pp;
     if (!pp_sym->is_fptr)
       aerr("func ptr data, but label '%s' !is_fptr\n", pp_sym->name);
     g_func_sym_pp = pp_sym;
@@ -302,7 +281,7 @@ check_sym:
   else {
     pp_sym = g_func_sym_pp;
     if (pp_sym == NULL)
-      return;
+      return pp;
   }
 
   if (pp->argc != pp_sym->argc || pp->argc_reg != pp_sym->argc_reg)
@@ -323,11 +302,13 @@ check_sym:
   }
 
   if (bad) {
-    sprint_pp(pp_sym, fp_sym, sizeof(fp_sym));
+    pp_print(fp_sym, sizeof(fp_sym), pp_sym);
     anote("var: %s\n", fp_var);
     anote("sym: %s\n", fp_sym);
     awarn("^ mismatch\n");
   }
+
+  return pp;
 }
 
 static int cmpstringp(const void *p1, const void *p2)
@@ -625,10 +606,12 @@ int main(int argc, char *argv[])
             snprintf(g_comment, sizeof(g_comment), "%s", p);
           }
           else {
-            check_var(fhdr, sym, p);
+            pp = check_var(fhdr, sym, p);
             if (p[0] != '_')
-              fprintf(fout, "_");
+              fprintf(fout, (pp && pp->is_fastcall) ? "@" : "_");
             fprintf(fout, "%s", p);
+            if (pp && pp->is_stdcall && pp->argc > 0)
+              fprintf(fout, "@%d", pp->argc * 4);
           }
         }
         else {