tools: allow stdin for compiling keymaps
authorPeter Hutterer <peter.hutterer@who-t.net>
Tue, 23 Jun 2020 23:00:08 +0000 (09:00 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Thu, 25 Jun 2020 00:32:08 +0000 (10:32 +1000)
This connects two tools to be useful together:
  xkbcommon-rmlvo-to-kccgst | xkbcommon-print-compiled-keymap  -
which will result in the full keymap generated by the former tool.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
tools/print-compiled-keymap.c

index e595ab1..04d98ba 100644 (file)
@@ -27,6 +27,7 @@
 #include <stdlib.h>
 #include <unistd.h>
 
+#include "utils.h"
 #include "xkbcommon/xkbcommon.h"
 
 int
@@ -62,10 +63,42 @@ main(int argc, char *argv[])
         goto out;
     }
 
-    file = fopen(keymap_path, "rb");
-    if (!file) {
-        fprintf(stderr, "Failed to open path: %s\n", keymap_path);
-        goto out;
+    if (streq(keymap_path, "-")) {
+        FILE *tmp;
+
+        tmp = tmpfile();
+        if (!tmp) {
+            fprintf(stderr, "Failed to create tmpfile\n");
+            goto out;
+        }
+
+        while (true) {
+            char buf[4096];
+            size_t len;
+
+            len = fread(buf, 1, sizeof(buf), stdin);
+            if (ferror(stdin)) {
+                fprintf(stderr, "Failed to read from stdin\n");
+                goto out;
+            }
+            if (len > 0) {
+                size_t wlen = fwrite(buf, 1, len, tmp);
+                if (wlen != len) {
+                    fprintf(stderr, "Failed to write to tmpfile\n");
+                    goto out;
+                }
+            }
+            if (feof(stdin))
+                break;
+        }
+        fseek(tmp, 0, SEEK_SET);
+        file = tmp;
+    } else {
+        file = fopen(keymap_path, "rb");
+        if (!file) {
+            fprintf(stderr, "Failed to open path: %s\n", keymap_path);
+            goto out;
+        }
     }
 
     keymap = xkb_keymap_new_from_file(ctx, file,