/* * Copyright © 2021 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 "xkbcommon/xkbcommon.h" #include "xkbcommon/xkbcommon-compose.h" static void usage(FILE *fp, char *progname) { fprintf(fp, "Usage: %s [--locale LOCALE | --locale-from-env | --locale-from-setlocale]\n", progname); fprintf(fp, " --locale - specify the locale directly\n" " --locale-from-env - get the locale from the LC_ALL/LC_CTYPE/LANG environment variables (falling back to C)\n" " --locale-from-setlocale - get the locale using setlocale(3)\n" ); } int main(int argc, char *argv[]) { int ret = EXIT_FAILURE; struct xkb_context *ctx = NULL; struct xkb_compose_table *compose_table = NULL; const char *locale = NULL; enum options { OPT_LOCALE, OPT_LOCALE_FROM_ENV, OPT_LOCALE_FROM_SETLOCALE, }; static struct option opts[] = { {"locale", required_argument, 0, OPT_LOCALE}, {"locale-from-env", no_argument, 0, OPT_LOCALE_FROM_ENV}, {"locale-from-setlocale", no_argument, 0, OPT_LOCALE_FROM_SETLOCALE}, {0, 0, 0, 0}, }; setlocale(LC_ALL, ""); while (1) { int opt; int option_index = 0; opt = getopt_long(argc, argv, "h", opts, &option_index); if (opt == -1) break; switch (opt) { case OPT_LOCALE: locale = optarg; break; case OPT_LOCALE_FROM_ENV: locale = getenv("LC_ALL"); if (!locale) locale = getenv("LC_CTYPE"); if (!locale) locale = getenv("LANG"); if (!locale) locale = "C"; break; case OPT_LOCALE_FROM_SETLOCALE: locale = setlocale(LC_CTYPE, NULL); break; case 'h': usage(stdout, argv[0]); return EXIT_SUCCESS; case '?': usage(stderr, argv[0]); return EXIT_INVALID_USAGE; } } if (locale == NULL) { usage(stderr, argv[0]); return EXIT_INVALID_USAGE; } ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS); if (!ctx) { fprintf(stderr, "Couldn't create xkb context\n"); goto out; } compose_table = xkb_compose_table_new_from_locale(ctx, locale, XKB_COMPOSE_COMPILE_NO_FLAGS); if (!compose_table) { fprintf(stderr, "Couldn't create compose from locale\n"); goto out; } printf("Compiled successfully from locale %s\n", locale); out: xkb_compose_table_unref(compose_table); xkb_context_unref(ctx); return ret; }