#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; const struct input_key_name *kn; int r; if (limit < 5) return -1; while ((*pos == ' ' || *pos == '\t') && limit > 0) { (*nend)++; pos++; limit--; } if (pos[3] != '_') return -2; if (pos[0] == 'K' && pos[1] == 'E' && pos[2] == 'Y') { kn = key_name; r = sizeof (key_name) / sizeof (key_name[0]); } else if (pos[0] == 'B' && pos[1] == 'T' && pos[2] == 'N') { kn = btn_name; r = sizeof (btn_name) / sizeof (btn_name[0]); } else return -2; (*nend) += 4; pos += 4; limit -= 4; while (r >= l) { int len0, len1 = 0; _index = (l + r) / 2; len0 = strlen(kn[_index-1].name); while (len1 < limit && isgraph(pos[len1])) len1++; cmp = strncmp (kn[_index-1].name, pos, strlen(kn[_index-1].name)); if (len0 < len1 && cmp == 0) cmp = -1; if (cmp == 0) { *nend = pos + strlen (kn[_index-1].name); if (**nend != '\n' && **nend != '\t' && **nend != ' ' && *nend != pos) return -3; return kn[_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; }