tools: better fastcall support
[ia32rtools.git] / tools / mkdef_ord.c
index 3873c3a..648e0d4 100644 (file)
@@ -20,7 +20,7 @@ int main(int argc, char *argv[])
 {
   const struct parsed_proto *pp;
   FILE *fout, *fhdr;
-  char basename[256];
+  char basename[256] = { 0, };
   char line[256];
   char fmt[256];
   char word[256];
@@ -34,12 +34,14 @@ int main(int argc, char *argv[])
   for (arg = 1; arg < argc; arg++) {
     if (IS(argv[arg], "-n"))
       noname = 1;
+    else if (IS(argv[arg], "-b") && arg < argc - 1)
+      snprintf(basename, sizeof(basename), "%s", argv[++arg]);
     else
       break;
   }
 
   if (argc != arg + 2) {
-    printf("usage:\n%s [-n] <.h> <.def>\n", argv[0]);
+    printf("usage:\n%s [-n] [-b <basename>] <.h> <.def>\n", argv[0]);
     return 1;
   }
 
@@ -50,15 +52,17 @@ int main(int argc, char *argv[])
   fout = fopen(argv[arg++], "w");
   my_assert_not(fout, NULL);
 
-  p = strrchr(hdrfn, '.');
-  my_assert_not(p, NULL);
-  p2 = strrchr(hdrfn, '/');
-  if (p2++ == NULL)
-    p2 = hdrfn;
-  l = p - p2;
-  my_assert((unsigned int)l < 256, 1);
-  memcpy(basename, p2, l);
-  basename[l] = 0;
+  if (basename[0] == 0) {
+    p = strrchr(hdrfn, '.');
+    my_assert_not(p, NULL);
+    p2 = strrchr(hdrfn, '/');
+    if (p2++ == NULL)
+      p2 = hdrfn;
+    l = p - p2;
+    my_assert((unsigned int)l < 256, 1);
+    memcpy(basename, p2, l);
+    basename[l] = 0;
+  }
 
   snprintf(fmt, sizeof(fmt), "%s_%%d", basename);
 
@@ -91,9 +95,11 @@ int main(int argc, char *argv[])
     if (pp == NULL)
       return 1;
 
-    fprintf(fout, "  %s", word);
+    fputc(' ', fout);
+    fputc(pp->is_fastcall ? '@' : ' ', fout);
+    fprintf(fout, "%s", word);
     if (pp->is_stdcall)
-      fprintf(fout, "@%-2d", pp->argc_stack * 4);
+      fprintf(fout, "@%-2d", pp->argc * 4);
     else
       fprintf(fout, "   ");
     fprintf(fout, " @%d", ord);