minor fixes
[ia32rtools.git] / tools / mkdef_ord.c
1 /*
2  * ia32rtools
3  * (C) notaz, 2013,2014
4  *
5  * This work is licensed under the terms of 3-clause BSD license.
6  * See COPYING file in the top-level directory.
7  */
8
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
12
13 #include "my_assert.h"
14 #include "my_str.h"
15 #include "common.h"
16
17 #include "protoparse.h"
18
19 int main(int argc, char *argv[])
20 {
21   const struct parsed_proto *pp;
22   FILE *fout, *fhdr;
23   char basename[256] = { 0, };
24   char line[256];
25   char fmt[256];
26   char word[256];
27   int noname = 0;
28   const char *p2;
29   char *p;
30   int arg;
31   int ret, ord;
32   int l;
33
34   for (arg = 1; arg < argc; arg++) {
35     if (IS(argv[arg], "-n"))
36       noname = 1;
37     else if (IS(argv[arg], "-b") && arg < argc - 1)
38       snprintf(basename, sizeof(basename), "%s", argv[++arg]);
39     else
40       break;
41   }
42
43   if (argc != arg + 2) {
44     printf("usage:\n%s [-n] [-b <basename>] <.h> <.def>\n", argv[0]);
45     return 1;
46   }
47
48   hdrfn = argv[arg++];
49   fhdr = fopen(hdrfn, "r");
50   my_assert_not(fhdr, NULL);
51
52   fout = fopen(argv[arg++], "w");
53   my_assert_not(fout, NULL);
54
55   if (basename[0] == 0) {
56     p = strrchr(hdrfn, '.');
57     my_assert_not(p, NULL);
58     p2 = strrchr(hdrfn, '/');
59     if (p2++ == NULL)
60       p2 = hdrfn;
61     l = p - p2;
62     my_assert((unsigned int)l < 256, 1);
63     memcpy(basename, p2, l);
64     basename[l] = 0;
65   }
66
67   snprintf(fmt, sizeof(fmt), "%s_%%d", basename);
68
69   fprintf(fout, "LIBRARY %s\n", basename);
70   fprintf(fout, "EXPORTS\n");
71
72   while (fgets(line, sizeof(line), fhdr))
73   {
74     p = sskip(line);
75     if (*p == 0)
76       continue;
77
78     if (IS_START(p, "//"))
79       continue;
80
81     ret = 0;
82     while (p != NULL && *p != 0) {
83       p = next_word(word, sizeof(word), p);
84       ret = sscanf(word, fmt, &ord);
85       if (ret == 1)
86         break;
87     }
88     if (ret != 1) {
89       printf("scan for '%s' failed for '%s'\n", fmt, line);
90       return 1;
91     }
92
93     snprintf(word, sizeof(word), fmt, ord);
94     pp = proto_parse(fhdr, word, 0);
95     if (pp == NULL)
96       return 1;
97
98     fputc(' ', fout);
99     fputc(pp->is_fastcall ? '@' : ' ', fout);
100     fprintf(fout, "%s", word);
101     if (pp->is_stdcall)
102       fprintf(fout, "@%-2d", pp->argc * 4);
103     else
104       fprintf(fout, "   ");
105     fprintf(fout, " @%d", ord);
106     if (noname)
107       fprintf(fout, " NONAME");
108     fprintf(fout, "\n");
109   }
110
111   fclose(fhdr);
112   fclose(fout);
113   return 0;
114 }
115
116 // vim:ts=2:shiftwidth=2:expandtab