#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; }