minor fixes
[ia32rtools.git] / tools / mkdef_ord.c
CommitLineData
7637b6cc 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
1f906263 9#include <stdio.h>
10#include <stdlib.h>
11#include <string.h>
12
13#include "my_assert.h"
14#include "my_str.h"
30845119 15#include "common.h"
1f906263 16
17#include "protoparse.h"
18
19int main(int argc, char *argv[])
20{
21 const struct parsed_proto *pp;
22 FILE *fout, *fhdr;
285b3a6b 23 char basename[256] = { 0, };
1f906263 24 char line[256];
25 char fmt[256];
26 char word[256];
aa1aa2c2 27 int noname = 0;
28 const char *p2;
1f906263 29 char *p;
aa1aa2c2 30 int arg;
1f906263 31 int ret, ord;
32 int l;
33
aa1aa2c2 34 for (arg = 1; arg < argc; arg++) {
35 if (IS(argv[arg], "-n"))
36 noname = 1;
285b3a6b 37 else if (IS(argv[arg], "-b") && arg < argc - 1)
38 snprintf(basename, sizeof(basename), "%s", argv[++arg]);
aa1aa2c2 39 else
40 break;
41 }
42
43 if (argc != arg + 2) {
285b3a6b 44 printf("usage:\n%s [-n] [-b <basename>] <.h> <.def>\n", argv[0]);
1f906263 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
285b3a6b 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 }
1f906263 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
96e48847 78 if (IS_START(p, "//"))
1f906263 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
285b3a6b 98 fputc(' ', fout);
99 fputc(pp->is_fastcall ? '@' : ' ', fout);
100 fprintf(fout, "%s", word);
1f906263 101 if (pp->is_stdcall)
285b3a6b 102 fprintf(fout, "@%-2d", pp->argc * 4);
1f906263 103 else
104 fprintf(fout, " ");
aa1aa2c2 105 fprintf(fout, " @%d", ord);
106 if (noname)
107 fprintf(fout, " NONAME");
108 fprintf(fout, "\n");
1f906263 109 }
110
111 fclose(fhdr);
112 fclose(fout);
113 return 0;
114}
115
116// vim:ts=2:shiftwidth=2:expandtab