#include "config.h"
+#include <ctype.h>
+#include <errno.h>
#include <limits.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
-#ifdef _MSC_VER
+#ifdef _WIN32
#include <io.h>
#include <windows.h>
-#ifndef PATH_MAX
-#define PATH_MAX MAX_PATH
-#endif
#else
#include <unistd.h>
#include <termios.h>
#endif
-#include "utils.h"
#include "tools-common.h"
void
xkb_compose_state_get_utf8(compose_state, s, sizeof(s));
else
xkb_state_key_get_utf8(state, keycode, s, sizeof(s));
- printf("unicode [ %s ] ", s);
+ /* HACK: escape single control characters from C0 set using the
+ * Unicode codepoint convention. Ideally we would like to escape
+ * any non-printable character in the string.
+ */
+ if (!*s) {
+ printf("unicode [ ] ");
+ } else if (strlen(s) == 1 && (*s <= 0x1F || *s == 0x7F)) {
+ printf("unicode [ U+%04hX ] ", *s);
+ } else {
+ printf("unicode [ %s ] ", s);
+ }
layout = xkb_state_key_get_layout(state, keycode);
printf("layout [ %s (%d) ] ",
printf("]\n");
}
-#ifdef _MSC_VER
+#ifdef _WIN32
void
tools_disable_stdin_echo(void)
{
#endif
-static inline bool
-tools_setup_path(void)
-{
- const char *path = getenv("PATH");
- const char *extra_path = LIBXKBCOMMON_TOOL_PATH;
- char new_path[PATH_MAX];
-
- if (snprintf_safe(new_path, sizeof(new_path), "%s:%s",
- extra_path, path ? path : "")) {
- setenv("PATH", new_path, 1);
- return true;
- } else {
- return false;
- }
-}
-
int
tools_exec_command(const char *prefix, int real_argc, char **real_argv)
{
char *argv[64] = {NULL};
- char executable[128];
+ char executable[PATH_MAX];
const char *command;
+ int rc;
if (((size_t)real_argc >= ARRAY_SIZE(argv))) {
fprintf(stderr, "Too many arguments\n");
command = real_argv[0];
- if (!snprintf_safe(executable, sizeof(executable),
- "%s-%s", prefix, command)) {
+ rc = snprintf(executable, sizeof(executable),
+ "%s/%s-%s", LIBXKBCOMMON_TOOL_PATH, prefix, command);
+ if (rc < 0 || (size_t) rc >= sizeof(executable)) {
fprintf(stderr, "Failed to assemble command\n");
return EXIT_FAILURE;
}
- if (!tools_setup_path()) {
- fprintf(stderr, "Failed to set PATH\n");
- return EXIT_FAILURE;
- }
-
argv[0] = executable;
for (int i = 1; i < real_argc; i++)
argv[i] = real_argv[i];
- execvp(executable, argv);
+ execv(executable, argv);
if (errno == ENOENT) {
fprintf(stderr, "Command '%s' is not available\n", command);
return EXIT_INVALID_USAGE;