]> git.ozlabs.org Git - ccan-lca-2011.git/commitdiff
lca2011: simple cdump tool to generate cdump header and body.
authorRusty Russell <rusty@rustcorp.com.au>
Mon, 24 Jan 2011 11:11:51 +0000 (21:41 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Mon, 24 Jan 2011 11:11:51 +0000 (21:41 +1030)
ccan/oserver/tools/Makefile [new file with mode: 0644]
ccan/oserver/tools/make-cdump_oserver_files.c [new file with mode: 0644]

diff --git a/ccan/oserver/tools/Makefile b/ccan/oserver/tools/Makefile
new file mode 100644 (file)
index 0000000..495fe4b
--- /dev/null
@@ -0,0 +1,11 @@
+CFLAGS=-g -Wall  -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-declarations -I../../..
+
+default: ../oserver_cdump.c
+
+make-cdump_oserver_files: make-cdump_oserver_files.o ../../grab_file.o ../../cdump.o ../../noerr.o ../../talloc.o ../../tevent.o
+
+../../%.o:
+       make -C../../.. ccan/$*.o
+
+../oserver_cdump.c: ../oserver_types.h make-cdump_oserver_files
+       ./make-cdump_oserver_files ../oserver_cdump.h ../oserver_cdump.c ../oserver_types.h
diff --git a/ccan/oserver/tools/make-cdump_oserver_files.c b/ccan/oserver/tools/make-cdump_oserver_files.c
new file mode 100644 (file)
index 0000000..0694566
--- /dev/null
@@ -0,0 +1,65 @@
+#include <ccan/cdump/cdump_parse.h>
+#include <ccan/talloc/talloc.h>
+#include <ccan/grab_file/grab_file.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+#include <err.h>
+
+int main(int argc, char *argv[])
+{
+       unsigned int i;
+       int declfd, deffd;
+       char *defs, *decls;
+
+       if (argc < 4)
+               errx(1, "Usage: %s <declfile> <defsfile> <sourcefiles>...",
+                       argv[0]);
+
+       declfd = open(argv[1], O_WRONLY|O_CREAT|O_TRUNC, 0600);
+       if (declfd < 0)
+               err(1, "Opening %s", argv[1]);
+       deffd = open(argv[2], O_WRONLY|O_CREAT|O_TRUNC, 0600);
+       if (deffd < 0)
+               err(1, "Opening %s", argv[2]);
+
+       decls = (char *)"#ifndef OSERVER_CDUMP_DECLS_H\n"
+               "#define OSERVER_CDUMP_DECLS_H\n"
+               "/* Autogenerated by dump_headers. */\n"
+               "#include <ccan/cdump/cdump_internal.h>\n";
+       if (write(declfd, decls, strlen(decls)) != strlen(decls))
+               err(1, "Writing to %s", argv[1]);
+
+       defs = (char *)"/* Definitions: autogenerated by dump_headers */\n"
+               "#define CDUMP_FAKE 1\n"
+               "#include <ccan/oserver/oserver_types.h>\n"
+               "#include <ccan/oserver/oserver_cdump.h>\n"
+               "#include <stddef.h>\n";
+       if (write(deffd, defs, strlen(defs)) != strlen(defs))
+               err(1, "Writing to %s", argv[2]);
+
+       for (i = 3; i < argc; i++) {
+               char *errmsg, *code;
+
+               code = grab_file(NULL, argv[i], NULL);
+               if (!code)
+                       err(1, "Reading %s", argv[i]);
+               errmsg = cdump_parse(code, code, &decls, &defs);
+               if (errmsg)
+                       errx(1, "Parsing %s: %s", argv[1], errmsg);
+               if (write(declfd, decls, strlen(decls)) != strlen(decls))
+                       err(1, "Writing to %s", argv[1]);
+               if (write(deffd, defs, strlen(defs)) != strlen(defs))
+                       err(1, "Writing to %s", argv[2]);
+               talloc_free(code);
+       }
+
+       decls = (char *)"#endif /* OSERVER_CDUMP_DECLS_H */\n";
+       if (write(declfd, decls, strlen(decls)) != strlen(decls))
+               err(1, "Writing to %s", argv[1]);
+       close(declfd);
+       close(deffd);
+       return 0;
+}