storm hacks
[ia32rtools.git] / tools / cvt_data.c
index bf98401..2f32181 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,23 @@ 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 void output_decorated_pp(FILE *fout,
+  const struct parsed_proto *pp)
+{
+  if (pp->name[0] != '_')
+    fprintf(fout, pp->is_fastcall ? "@" : "_");
+  fprintf(fout, "%s", pp->name);
+  if (pp->is_stdcall && pp->argc > 0)
+    fprintf(fout, "@%d", pp->argc * 4);
 }
 
 static int cmpstringp(const void *p1, const void *p2)
@@ -339,6 +330,7 @@ int main(int argc, char *argv[])
 {
   FILE *fout, *fasm, *fhdr, *frlist;
   const struct parsed_proto *pp;
+  int no_decorations = 0;
   char words[20][256];
   char word[256];
   char line[256];
@@ -364,11 +356,19 @@ int main(int argc, char *argv[])
   char *p2;
 
   if (argc < 4) {
-    printf("usage:\n%s <.s> <.asm> <hdrf> [rlist]*\n",
+    // -nd: no symbol decorations
+    printf("usage:\n%s [-nd] <.s> <.asm> <hdrf> [rlist]*\n",
       argv[0]);
     return 1;
   }
 
+  for (arg = 1; arg < argc; arg++) {
+    if (IS(argv[arg], "-nd"))
+      no_decorations = 1;
+    else
+      break;
+  }
+
   arg_out = arg++;
 
   asmfn = argv[arg++];
@@ -501,7 +501,7 @@ int main(int argc, char *argv[])
           g_func_sym_pp = NULL;
 
         len = strlen(sym);
-        fprintf(fout, "_%s:", sym);
+        fprintf(fout, "%s%s:", no_decorations ? "" : "_", sym);
 
         len += 2;
         if (len < 8)
@@ -616,7 +616,8 @@ int main(int argc, char *argv[])
         }
         else if (is_label) {
           p = words[w];
-          if (IS_START(p, "loc_") || strchr(p, '?') || strchr(p, '@')
+          if (IS_START(p, "loc_") || IS_START(p, "__imp")
+             || strchr(p, '?') || strchr(p, '@')
              || bsearch(&p, rlist, rlist_cnt, sizeof(rlist[0]),
                   cmpstringp))
           {
@@ -624,8 +625,17 @@ int main(int argc, char *argv[])
             snprintf(g_comment, sizeof(g_comment), "%s", p);
           }
           else {
-            check_var(fhdr, sym, p);
-            fprintf(fout, "_%s", p);
+            pp = check_var(fhdr, sym, p);
+            if (pp == NULL) {
+              fprintf(fout, "%s%s",
+                (no_decorations || p[0] == '_') ? "" : "_", p);
+            }
+            else {
+              if (no_decorations)
+                fprintf(fout, "%s", pp->name);
+              else
+                output_decorated_pp(fout, pp);
+            }
           }
         }
         else {
@@ -652,7 +662,8 @@ fin:
 
   // dump public syms
   for (i = 0; i < pub_sym_cnt; i++)
-    fprintf(fout, ".global _%s\n", pub_syms[i]);
+    fprintf(fout, ".global %s%s\n",
+      no_decorations ? "" : "_", pub_syms[i]);
 
   fclose(fout);
   fclose(fasm);