tools: add include path handling to rmlvo-to-keymap
[platform/upstream/libxkbcommon.git] / tools / print-compiled-keymap.c
1 /*
2  * Copyright © 2012 Ran Benita <ran234@gmail.com>
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21  * DEALINGS IN THE SOFTWARE.
22  */
23
24 #include "config.h"
25
26 #include <stdbool.h>
27 #include <stdio.h>
28 #include <stdlib.h>
29 #include <string.h>
30 #include <unistd.h>
31
32 #include "xkbcommon/xkbcommon.h"
33
34 int
35 main(int argc, char *argv[])
36 {
37     int ret = EXIT_FAILURE;
38     int opt;
39     struct xkb_context *ctx = NULL;
40     struct xkb_keymap *keymap = NULL;
41     const char *keymap_path = NULL;
42     FILE *file = NULL;
43     char *dump;
44
45     while ((opt = getopt(argc, argv, "h")) != -1) {
46         switch (opt) {
47         case 'h':
48         case '?':
49             fprintf(stderr, "Usage: %s <path to keymap file>\n", argv[0]);
50             exit(EXIT_FAILURE);
51         }
52     }
53
54     if (optind >= argc) {
55         fprintf(stderr, "Error: missing path to keymap file\n");
56         exit(EXIT_FAILURE);
57     }
58
59     keymap_path = argv[optind];
60
61     ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
62     if (!ctx) {
63         fprintf(stderr, "Couldn't create xkb context\n");
64         goto out;
65     }
66
67     if (strcmp(keymap_path, "-") == 0) {
68         FILE *tmp;
69
70         tmp = tmpfile();
71         if (!tmp) {
72             fprintf(stderr, "Failed to create tmpfile\n");
73             goto out;
74         }
75
76         while (true) {
77             char buf[4096];
78             size_t len;
79
80             len = fread(buf, 1, sizeof(buf), stdin);
81             if (ferror(stdin)) {
82                 fprintf(stderr, "Failed to read from stdin\n");
83                 goto out;
84             }
85             if (len > 0) {
86                 size_t wlen = fwrite(buf, 1, len, tmp);
87                 if (wlen != len) {
88                     fprintf(stderr, "Failed to write to tmpfile\n");
89                     goto out;
90                 }
91             }
92             if (feof(stdin))
93                 break;
94         }
95         fseek(tmp, 0, SEEK_SET);
96         file = tmp;
97     } else {
98         file = fopen(keymap_path, "rb");
99         if (!file) {
100             fprintf(stderr, "Failed to open path: %s\n", keymap_path);
101             goto out;
102         }
103     }
104
105     keymap = xkb_keymap_new_from_file(ctx, file,
106                                       XKB_KEYMAP_FORMAT_TEXT_V1, 0);
107     if (!keymap) {
108         fprintf(stderr, "Couldn't create xkb keymap\n");
109         goto out;
110     }
111
112     dump = xkb_keymap_get_as_string(keymap, XKB_KEYMAP_FORMAT_TEXT_V1);
113     if (!dump) {
114         fprintf(stderr, "Couldn't get the keymap string\n");
115         goto out;
116     }
117
118     fputs(dump, stdout);
119
120     ret = EXIT_SUCCESS;
121     free(dump);
122 out:
123     if (file)
124         fclose(file);
125     xkb_keymap_unref(keymap);
126     xkb_context_unref(ctx);
127     return ret;
128 }