Commit fc2d4fa2aba307e5c2a3c86b1879b05c2c738dba

Peter Hutterer 2020-07-07T11:43:08

tools: add ability to compile from kccgst to rmlvo-to-keymap This obsoletes the print-compiled-keymap tool though we now require that the kccgst components are passed via stdin, there is no file loading ability. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>

diff --git a/meson.build b/meson.build
index 9a5079d..30ba76b 100644
--- a/meson.build
+++ b/meson.build
@@ -521,7 +521,6 @@ tools_dep = declare_dependency(
 
 if cc.has_header_symbol('getopt.h', 'getopt_long', prefix: '#define _GNU_SOURCE')
     executable('xkbcommon-rmlvo-to-keymap', 'tools/rmlvo-to-keymap.c', dependencies: tools_dep)
-    executable('xkbcommon-print-compiled-keymap', 'tools/print-compiled-keymap.c', dependencies: tools_dep)
     executable('xkbcommon-how-to-type', 'tools/how-to-type.c', dependencies: tools_dep)
 endif
 if cc.has_header('linux/input.h')
diff --git a/tools/print-compiled-keymap.c b/tools/print-compiled-keymap.c
deleted file mode 100644
index 1ba648b..0000000
--- a/tools/print-compiled-keymap.c
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright © 2012 Ran Benita <ran234@gmail.com>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#include "config.h"
-
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "xkbcommon/xkbcommon.h"
-
-int
-main(int argc, char *argv[])
-{
-    int ret = EXIT_FAILURE;
-    int opt;
-    struct xkb_context *ctx = NULL;
-    struct xkb_keymap *keymap = NULL;
-    const char *keymap_path = NULL;
-    FILE *file = NULL;
-    char *dump;
-
-    while ((opt = getopt(argc, argv, "h")) != -1) {
-        switch (opt) {
-        case 'h':
-        case '?':
-            fprintf(stderr, "Usage: %s <path to keymap file>\n", argv[0]);
-            exit(EXIT_FAILURE);
-        }
-    }
-
-    if (optind >= argc) {
-        fprintf(stderr, "Error: missing path to keymap file\n");
-        exit(EXIT_FAILURE);
-    }
-
-    keymap_path = argv[optind];
-
-    ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
-    if (!ctx) {
-        fprintf(stderr, "Couldn't create xkb context\n");
-        goto out;
-    }
-
-    if (strcmp(keymap_path, "-") == 0) {
-        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,
-                                      XKB_KEYMAP_FORMAT_TEXT_V1, 0);
-    if (!keymap) {
-        fprintf(stderr, "Couldn't create xkb keymap\n");
-        goto out;
-    }
-
-    dump = xkb_keymap_get_as_string(keymap, XKB_KEYMAP_FORMAT_TEXT_V1);
-    if (!dump) {
-        fprintf(stderr, "Couldn't get the keymap string\n");
-        goto out;
-    }
-
-    fputs(dump, stdout);
-
-    ret = EXIT_SUCCESS;
-    free(dump);
-out:
-    if (file)
-        fclose(file);
-    xkb_keymap_unref(keymap);
-    xkb_context_unref(ctx);
-    return ret;
-}
diff --git a/tools/rmlvo-to-keymap.c b/tools/rmlvo-to-keymap.c
index f645e53..4783be7 100644
--- a/tools/rmlvo-to-keymap.c
+++ b/tools/rmlvo-to-keymap.c
@@ -41,6 +41,7 @@ static bool verbose = false;
 static enum output_format {
     FORMAT_KEYMAP,
     FORMAT_KCCGST,
+    FORMAT_KEYMAP_FROM_XKB,
 } output_format = FORMAT_KEYMAP;
 static darray(const char *) includes;
 
@@ -56,6 +57,9 @@ usage(char **argv)
            "    Enable verbose debugging output\n"
            " --kccgst\n"
            "    Print a keymap which only includes the KcCGST component names instead of the full keymap\n"
+           " --from-xkb\n"
+           "    Load the XKB file from stdin, ignore RMLVO options. This option\n"
+           "    must not be used with --kccgst.\n"
            " --include\n"
            "    Add the given path to the include path list. This option is\n"
            "    order-dependent, include paths given first are searched first.\n"
@@ -91,6 +95,7 @@ parse_options(int argc, char **argv, struct xkb_rule_names *names)
     enum options {
         OPT_VERBOSE,
         OPT_KCCGST,
+        OPT_FROM_XKB,
         OPT_INCLUDE,
         OPT_INCLUDE_DEFAULTS,
         OPT_RULES,
@@ -103,6 +108,7 @@ parse_options(int argc, char **argv, struct xkb_rule_names *names)
         {"help",             no_argument,            0, 'h'},
         {"verbose",          no_argument,            0, OPT_VERBOSE},
         {"kccgst",           no_argument,            0, OPT_KCCGST},
+        {"from-xkb",         no_argument,            0, OPT_FROM_XKB},
         {"include",          required_argument,      0, OPT_INCLUDE},
         {"include-defaults", no_argument,            0, OPT_INCLUDE_DEFAULTS},
         {"rules",            required_argument,      0, OPT_RULES},
@@ -130,6 +136,9 @@ parse_options(int argc, char **argv, struct xkb_rule_names *names)
         case OPT_KCCGST:
             output_format = FORMAT_KCCGST;
             break;
+        case OPT_FROM_XKB:
+            output_format = FORMAT_KEYMAP_FROM_XKB;
+            break;
         case OPT_INCLUDE:
             darray_append(includes, optarg);
             break;
@@ -199,6 +208,65 @@ print_keymap(struct xkb_context *ctx, const struct xkb_rule_names *rmlvo)
     return true;
 }
 
+static bool
+print_keymap_from_file(struct xkb_context *ctx)
+{
+    struct xkb_keymap *keymap = NULL;
+    char *keymap_string = NULL;
+    FILE *file = NULL;
+    bool success = false;
+
+    file = tmpfile();
+    if (!file) {
+        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, file);
+            if (wlen != len) {
+                fprintf(stderr, "Failed to write to tmpfile\n");
+                goto out;
+            }
+        }
+        if (feof(stdin))
+            break;
+    }
+    fseek(file, 0, SEEK_SET);
+    keymap = xkb_keymap_new_from_file(ctx, file,
+                                      XKB_KEYMAP_FORMAT_TEXT_V1, 0);
+    if (!keymap) {
+        fprintf(stderr, "Couldn't create xkb keymap\n");
+        goto out;
+    }
+
+    keymap_string = xkb_keymap_get_as_string(keymap, XKB_KEYMAP_FORMAT_TEXT_V1);
+    if (!keymap_string) {
+        fprintf(stderr, "Couldn't get the keymap string\n");
+        goto out;
+    }
+
+    fputs(keymap_string, stdout);
+    success = true;
+
+out:
+    if (file)
+        fclose(file);
+    xkb_keymap_unref(keymap);
+    free(keymap_string);
+
+    return success;
+}
+
 int
 main(int argc, char **argv)
 {
@@ -244,6 +312,8 @@ main(int argc, char **argv)
         rc = print_keymap(ctx, &names) ? EXIT_SUCCESS : EXIT_FAILURE;
     } else if (output_format == FORMAT_KCCGST) {
         rc = print_kccgst(ctx, &names) ? EXIT_SUCCESS : EXIT_FAILURE;
+    } else if (output_format == FORMAT_KEYMAP_FROM_XKB) {
+        rc = print_keymap_from_file(ctx);
     }
 
     xkb_context_unref(ctx);