From 6e40287e2f39a80fc72bd8d0fbc1a8334d688c2d Mon Sep 17 00:00:00 2001 From: etobi Date: Tue, 3 Sep 2013 09:48:38 +0200 Subject: Imported Upstream version 1.1.0 --- util/av7110_loadkeys/av7110_loadkeys.c | 186 +++++++++++++++++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 util/av7110_loadkeys/av7110_loadkeys.c (limited to 'util/av7110_loadkeys/av7110_loadkeys.c') diff --git a/util/av7110_loadkeys/av7110_loadkeys.c b/util/av7110_loadkeys/av7110_loadkeys.c new file mode 100644 index 0000000..e9eeea0 --- /dev/null +++ b/util/av7110_loadkeys/av7110_loadkeys.c @@ -0,0 +1,186 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "input_keynames.h" + + +static +void print_error (const char *action, const char *file) +__attribute__ ((noreturn)); + + +static +void print_error (const char *action, const char *file) +{ + static const char msg [] = "\nERROR: could not "; + + write (0, msg, strlen(msg)); + write (0, action, strlen(action)); + write (0, " '", 2); + write (0, file, strlen(file)); + write (0, "'\n\n", 3); + exit (-1); +} + + +static +int parse_keyname (char *pos, char **nend, int limit) +{ + int cmp, index; + int l = 1; + int r = sizeof (key_name) / sizeof (key_name[0]); + + if (limit < 5) + return -1; + + while ((*pos == ' ' || *pos == '\t') && limit > 0) { + (*nend)++; + pos++; + limit--; + } + + if (pos [0] != 'K' || pos[1] != 'E' || pos[2] != 'Y' || pos[3] != '_') + return -2; + + (*nend) += 4; + pos += 4; + limit -= 4; + + while (r >= l) { + int len0, len1 = 0; + + index = (l + r) / 2; + + len0 = strlen(key_name[index-1].name); + + while (len1 < limit && isgraph(pos[len1])) + len1++; + + cmp = strncmp (key_name[index-1].name, pos, + strlen(key_name[index-1].name)); + + if (len0 < len1 && cmp == 0) + cmp = -1; + + if (cmp == 0) { + *nend = pos + strlen (key_name[index-1].name); + + if (**nend != '\n' && + **nend != '\t' && + **nend != ' ' && + *nend != pos) + return -3; + + return key_name[index-1].key; + } + + if (cmp < 0) + l = index + 1; + else + r = index - 1; + + if (r < l) { + static const char msg [] = "\nunknown key '"; + write (0, msg, strlen(msg)); + write (0, pos-4, len1 + 4); + write (0, "'\n", 2); + } + }; + + return -4; +} + + + +const char usage [] = "\n\tusage: av7110_loadkeys [-i|--invert] [-a|--address ] keymap_filename.(rc5|rcmm)\n\n"; + + +struct ir_setup { + __u32 ir_config; + __u16 keytab [256]; +} __attribute__ ((packed)); + + +int main (int argc, char **argv) +{ + static struct ir_setup setup; + int i, fd; + size_t len; + char *buf, *pos, *fname = NULL; + + for (i=1; i 0xff) { + const char msg [] = + "\nERROR: key must be in range 0 ... 0xff!\n\n"; + + write (0, msg, strlen(msg)); + exit (-1); + } + + if (keycode < 0) + print_error ("parse", fname); + + setup.keytab[key] = keycode; + } + + munmap (buf, len); + close (fd); + + write (1, &setup, 4 + 256 * sizeof(__u16)); + + return 0; +} + + -- cgit v1.2.3