From fc2d4fa2aba307e5c2a3c86b1879b05c2c738dba Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Tue, 7 Jul 2020 11:43:08 +1000 Subject: 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 --- tools/print-compiled-keymap.c | 128 ------------------------------------------ tools/rmlvo-to-keymap.c | 70 +++++++++++++++++++++++ 2 files changed, 70 insertions(+), 128 deletions(-) delete mode 100644 tools/print-compiled-keymap.c (limited to 'tools') 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 - * - * 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 -#include -#include -#include -#include - -#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 \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); -- cgit v1.2.1