check-messages.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /*
  2. * Copyright © 2023 Pierre Le Marre <dev@wismill.eu>
  3. * SPDX-License-Identifier: MIT
  4. */
  5. #include "config.h"
  6. #include <limits.h>
  7. #include <locale.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include "messages-codes.h"
  12. #include "messages.h"
  13. #include "utils.h"
  14. #define XKB_PREFIX "XKB-"
  15. static enum xkb_message_code
  16. parse_message_code(char *raw_code) {
  17. if (istreq_prefix(XKB_PREFIX, raw_code))
  18. raw_code += sizeof(XKB_PREFIX) - 1;
  19. char *endp = raw_code;
  20. errno = 0;
  21. const unsigned long code = strtoul(raw_code, &endp, 10);
  22. return (errno || endp == raw_code || *endp != '\0' || code > INT_MAX)
  23. ? 0
  24. : (enum xkb_message_code)code;
  25. }
  26. static void
  27. usage(char **argv)
  28. {
  29. printf("Usage: %s MESSAGE_CODES\n"
  30. "\n"
  31. "Check whether the given message codes are supported.\n",
  32. argv[0]);
  33. const struct xkb_message_entry *xkb_messages;
  34. size_t count = xkb_message_get_all(&xkb_messages);
  35. printf("\nCurrent supported messages:\n");
  36. for (size_t idx = 0; idx < count; idx++) {
  37. printf("- XKB-%03u: %s\n", xkb_messages[idx].code, xkb_messages[idx].label);
  38. }
  39. }
  40. #define XKB_CHECK_MSG_ERROR_PREFIX "xkb-check-messages: ERROR: "
  41. #define MALFORMED_MESSAGE (1 << 2)
  42. #define UNSUPPORTED_MESSAGE (1 << 3)
  43. int main(int argc, char **argv) {
  44. setlocale(LC_ALL, "");
  45. if (argc <= 1) {
  46. usage(argv);
  47. return EXIT_INVALID_USAGE;
  48. }
  49. int rc = 0;
  50. enum xkb_message_code code;
  51. const struct xkb_message_entry* entry;
  52. for (int k=1; k < argc; k++) {
  53. code = parse_message_code(argv[k]);
  54. if (!code) {
  55. fprintf(stderr,
  56. XKB_CHECK_MSG_ERROR_PREFIX "Malformed message code: \"%s\"\n",
  57. argv[k]);
  58. rc |= MALFORMED_MESSAGE;
  59. continue;
  60. }
  61. entry = xkb_message_get(code);
  62. if (entry == NULL) {
  63. fprintf(stderr,
  64. XKB_CHECK_MSG_ERROR_PREFIX "Unsupported message code: \"%s\"\n",
  65. argv[k]);
  66. rc |= UNSUPPORTED_MESSAGE;
  67. }
  68. }
  69. return rc;
  70. }