Add support for direct file reading and writing in wayland-scanner.
authorJussi Pakkanen <jpakkane@gmail.com>
Mon, 2 Mar 2015 14:08:00 +0000 (16:08 +0200)
committerPekka Paalanen <pekka.paalanen@collabora.co.uk>
Fri, 27 Mar 2015 13:02:38 +0000 (15:02 +0200)
Add support for direct file reading and writing in wayland-scanner.

Signed-off-by: Jussi Pakkanen <jpakkane@gmail.com>
Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
Acked-by: David Fort <rdp.effort@gmail.com>
src/scanner.c

index 1f1e59a..efdc69c 100644 (file)
@@ -39,11 +39,12 @@ enum side {
 static int
 usage(int ret)
 {
-       fprintf(stderr, "usage: ./scanner [client-header|server-header|code]\n");
+       fprintf(stderr, "usage: ./scanner [client-header|server-header|code]"
+               " [input_file output_file]\n");
        fprintf(stderr, "\n");
        fprintf(stderr, "Converts XML protocol descriptions supplied on "
-                       "stdin to client headers,\n"
-                       "server headers, or protocol marshalling code.\n");
+                       "stdin or input file to client\n"
+                       "headers, server headers, or protocol marshalling code.\n");
        exit(ret);
 }
 
@@ -1252,6 +1253,7 @@ int main(int argc, char *argv[])
 {
        struct parse_context ctx;
        struct protocol protocol;
+       FILE *input = stdin;
        int len;
        void *buf;
        enum {
@@ -1260,7 +1262,7 @@ int main(int argc, char *argv[])
                CODE,
        } mode;
 
-       if (argc != 2)
+       if (argc != 2 && argc != 4)
                usage(EXIT_FAILURE);
        else if (strcmp(argv[1], "help") == 0 || strcmp(argv[1], "--help") == 0)
                usage(EXIT_SUCCESS);
@@ -1273,6 +1275,20 @@ int main(int argc, char *argv[])
        else
                usage(EXIT_FAILURE);
 
+       if (argc == 4) {
+               input = fopen(argv[2], "r");
+               if (input == NULL) {
+                       fprintf(stderr, "Could not open input file: %s\n",
+                               strerror(errno));
+                       exit(EXIT_FAILURE);
+               }
+               if (freopen(argv[3], "w", stdout) == NULL) {
+                       fprintf(stderr, "Could not open output file: %s\n",
+                               strerror(errno));
+                       exit(EXIT_FAILURE);
+               }
+       }
+
        wl_list_init(&protocol.interface_list);
        protocol.type_index = 0;
        protocol.null_run_length = 0;
@@ -1293,7 +1309,7 @@ int main(int argc, char *argv[])
 
        do {
                buf = XML_GetBuffer(ctx.parser, XML_BUFFER_SIZE);
-               len = fread(buf, 1, XML_BUFFER_SIZE, stdin);
+               len = fread(buf, 1, XML_BUFFER_SIZE, input);
                if (len < 0) {
                        fprintf(stderr, "fread: %m\n");
                        exit(EXIT_FAILURE);