]> git.ozlabs.org Git - ccan-lca-2011.git/blob - ccan/oserver/tools/make-cdump_oserver_files.c
0694566acdc02316bb408d5306b218206bee941a
[ccan-lca-2011.git] / ccan / oserver / tools / make-cdump_oserver_files.c
1 #include <ccan/cdump/cdump_parse.h>
2 #include <ccan/talloc/talloc.h>
3 #include <ccan/grab_file/grab_file.h>
4 #include <sys/types.h>
5 #include <sys/stat.h>
6 #include <fcntl.h>
7 #include <unistd.h>
8 #include <string.h>
9 #include <err.h>
10
11 int main(int argc, char *argv[])
12 {
13         unsigned int i;
14         int declfd, deffd;
15         char *defs, *decls;
16
17         if (argc < 4)
18                 errx(1, "Usage: %s <declfile> <defsfile> <sourcefiles>...",
19                         argv[0]);
20
21         declfd = open(argv[1], O_WRONLY|O_CREAT|O_TRUNC, 0600);
22         if (declfd < 0)
23                 err(1, "Opening %s", argv[1]);
24         deffd = open(argv[2], O_WRONLY|O_CREAT|O_TRUNC, 0600);
25         if (deffd < 0)
26                 err(1, "Opening %s", argv[2]);
27
28         decls = (char *)"#ifndef OSERVER_CDUMP_DECLS_H\n"
29                 "#define OSERVER_CDUMP_DECLS_H\n"
30                 "/* Autogenerated by dump_headers. */\n"
31                 "#include <ccan/cdump/cdump_internal.h>\n";
32         if (write(declfd, decls, strlen(decls)) != strlen(decls))
33                 err(1, "Writing to %s", argv[1]);
34
35         defs = (char *)"/* Definitions: autogenerated by dump_headers */\n"
36                 "#define CDUMP_FAKE 1\n"
37                 "#include <ccan/oserver/oserver_types.h>\n"
38                 "#include <ccan/oserver/oserver_cdump.h>\n"
39                 "#include <stddef.h>\n";
40         if (write(deffd, defs, strlen(defs)) != strlen(defs))
41                 err(1, "Writing to %s", argv[2]);
42
43         for (i = 3; i < argc; i++) {
44                 char *errmsg, *code;
45
46                 code = grab_file(NULL, argv[i], NULL);
47                 if (!code)
48                         err(1, "Reading %s", argv[i]);
49                 errmsg = cdump_parse(code, code, &decls, &defs);
50                 if (errmsg)
51                         errx(1, "Parsing %s: %s", argv[1], errmsg);
52                 if (write(declfd, decls, strlen(decls)) != strlen(decls))
53                         err(1, "Writing to %s", argv[1]);
54                 if (write(deffd, defs, strlen(defs)) != strlen(defs))
55                         err(1, "Writing to %s", argv[2]);
56                 talloc_free(code);
57         }
58
59         decls = (char *)"#endif /* OSERVER_CDUMP_DECLS_H */\n";
60         if (write(declfd, decls, strlen(decls)) != strlen(decls))
61                 err(1, "Writing to %s", argv[1]);
62         close(declfd);
63         close(deffd);
64         return 0;
65 }