.def tool, generate .lib and tramp on demand
authornotaz <notasas@gmail.com>
Sat, 18 Jan 2014 19:48:35 +0000 (21:48 +0200)
committernotaz <notasas@gmail.com>
Sun, 19 Jan 2014 23:24:14 +0000 (01:24 +0200)
run_imp.sh
tools/Makefile
tools/mkdef_ord.c [new file with mode: 0644]
tools/protoparse.h

index fd049d0..7c10376 100755 (executable)
@@ -2,8 +2,8 @@
 
 grep 'extrn ' StarCraft.asm | awk '{print $2}' | awk -F: '{print $1}' > implist
 
-echo ".data" > tramp.s
-echo ".align 4" >> tramp.s
+echo ".data" > $1
+echo ".align 4" >> $1
 
 cat implist | while read i; do
   rm -f tmpsym
@@ -30,8 +30,8 @@ cat implist | while read i; do
     exit 1
   fi
 
-  echo ".globl $i" >> tramp.s
-  echo "$i:" >> tramp.s
-  echo "  .long $sym" >> tramp.s
-  echo >> tramp.s
+  echo ".globl $i" >> $1
+  echo "$i:" >> $1
+  echo "  .long $sym" >> $1
+  echo >> $1
 done
index 4d61132..d7ed711 100644 (file)
@@ -3,7 +3,7 @@ ifndef DEBUG
 CFLAGS += -O2
 endif
 
-T = asmproc cmpmrg_text mkbridge translate cvt_data
+T = asmproc cmpmrg_text mkbridge translate cvt_data mkdef_ord
 
 all: $(T)
 
@@ -13,4 +13,6 @@ clean:
 translate: translate.o
 mkbridge: mkbridge.o
 cvt_data: cvt_data.o
-mkbridge.o translate.o cvt_data.o: protoparse.h my_assert.h my_str.h
+mkdef_ord: mkdef_ord.o
+mkbridge.o translate.o cvt_data.o mkdef_ord.o: \
+ protoparse.h my_assert.h my_str.h
diff --git a/tools/mkdef_ord.c b/tools/mkdef_ord.c
new file mode 100644 (file)
index 0000000..4f6b50b
--- /dev/null
@@ -0,0 +1,90 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "my_assert.h"
+#include "my_str.h"
+
+#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
+#define IS(w, y) !strcmp(w, y)
+#define IS_START(w, y) !strncmp(w, y, strlen(y))
+
+#include "protoparse.h"
+
+int main(int argc, char *argv[])
+{
+  const struct parsed_proto *pp;
+  FILE *fout, *fhdr;
+  char basename[256];
+  char line[256];
+  char fmt[256];
+  char word[256];
+  char *p;
+  int arg = 1;
+  int ret, ord;
+  int l;
+
+  if (argc != 3) {
+    printf("usage:\n%s <.h> <.def>\n", argv[0]);
+    return 1;
+  }
+
+  hdrfn = argv[arg++];
+  fhdr = fopen(hdrfn, "r");
+  my_assert_not(fhdr, NULL);
+
+  fout = fopen(argv[arg++], "w");
+  my_assert_not(fout, NULL);
+
+  p = strrchr(hdrfn, '.');
+  my_assert_not(p, NULL);
+  l = p - hdrfn;
+  my_assert(l < 256, 1);
+  memcpy(basename, hdrfn, l);
+  basename[l] = 0;
+
+  snprintf(fmt, sizeof(fmt), "%s_%%d", basename);
+
+  fprintf(fout, "LIBRARY %s\n", basename);
+  fprintf(fout, "EXPORTS\n");
+
+  while (fgets(line, sizeof(line), fhdr))
+  {
+    p = sskip(line);
+    if (*p == 0)
+      continue;
+
+    if (IS(p, "//"))
+      continue;
+
+    ret = 0;
+    while (p != NULL && *p != 0) {
+      p = next_word(word, sizeof(word), p);
+      ret = sscanf(word, fmt, &ord);
+      if (ret == 1)
+        break;
+    }
+    if (ret != 1) {
+      printf("scan for '%s' failed for '%s'\n", fmt, line);
+      return 1;
+    }
+
+    snprintf(word, sizeof(word), fmt, ord);
+    pp = proto_parse(fhdr, word, 0);
+    if (pp == NULL)
+      return 1;
+
+    fprintf(fout, "  %s", word);
+    if (pp->is_stdcall)
+      fprintf(fout, "@%-2d", pp->argc_stack * 4);
+    else
+      fprintf(fout, "   ");
+    fprintf(fout, " @%d\n", ord);
+  }
+
+  fclose(fhdr);
+  fclose(fout);
+  return 0;
+}
+
+// vim:ts=2:shiftwidth=2:expandtab
index c585306..3981588 100644 (file)
@@ -610,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);
@@ -619,6 +621,7 @@ 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,