16a5c94d9SSamuel Thibault // SPDX-License-Identifier: GPL-2.0+
26a5c94d9SSamuel Thibault /* makemapdata.c
36a5c94d9SSamuel Thibault * originally written by: Kirk Reiser.
46a5c94d9SSamuel Thibault *
56a5c94d9SSamuel Thibault ** Copyright (C) 2002 Kirk Reiser.
66a5c94d9SSamuel Thibault * Copyright (C) 2003 David Borowski.
76a5c94d9SSamuel Thibault */
86a5c94d9SSamuel Thibault
96a5c94d9SSamuel Thibault #include <stdlib.h>
106a5c94d9SSamuel Thibault #include <stdio.h>
116a5c94d9SSamuel Thibault #include <libgen.h>
126a5c94d9SSamuel Thibault #include <string.h>
136a5c94d9SSamuel Thibault #include <ctype.h>
146a5c94d9SSamuel Thibault #include "utils.h"
156a5c94d9SSamuel Thibault
166a5c94d9SSamuel Thibault static char buffer[256];
176a5c94d9SSamuel Thibault
get_define(void)186a5c94d9SSamuel Thibault static int get_define(void)
196a5c94d9SSamuel Thibault {
206a5c94d9SSamuel Thibault char *c;
216a5c94d9SSamuel Thibault
226a5c94d9SSamuel Thibault while (fgets(buffer, sizeof(buffer)-1, infile)) {
236a5c94d9SSamuel Thibault lc++;
246a5c94d9SSamuel Thibault if (strncmp(buffer, "#define", 7))
256a5c94d9SSamuel Thibault continue;
266a5c94d9SSamuel Thibault c = buffer + 7;
276a5c94d9SSamuel Thibault while (*c == ' ' || *c == '\t')
286a5c94d9SSamuel Thibault c++;
296a5c94d9SSamuel Thibault def_name = c;
306a5c94d9SSamuel Thibault while (*c && *c != ' ' && *c != '\t' && *c != '\n')
316a5c94d9SSamuel Thibault c++;
326a5c94d9SSamuel Thibault if (!*c || *c == '\n')
336a5c94d9SSamuel Thibault continue;
346a5c94d9SSamuel Thibault *c++ = '\0';
356a5c94d9SSamuel Thibault while (*c == ' ' || *c == '\t' || *c == '(')
366a5c94d9SSamuel Thibault c++;
376a5c94d9SSamuel Thibault def_val = c;
386a5c94d9SSamuel Thibault while (*c && *c != '\n' && *c != ')')
396a5c94d9SSamuel Thibault c++;
406a5c94d9SSamuel Thibault *c++ = '\0';
416a5c94d9SSamuel Thibault return 1;
426a5c94d9SSamuel Thibault }
436a5c94d9SSamuel Thibault fclose(infile);
446a5c94d9SSamuel Thibault infile = 0;
456a5c94d9SSamuel Thibault return 0;
466a5c94d9SSamuel Thibault }
476a5c94d9SSamuel Thibault
486a5c94d9SSamuel Thibault int
main(int argc,char * argv[])496a5c94d9SSamuel Thibault main(int argc, char *argv[])
506a5c94d9SSamuel Thibault {
516a5c94d9SSamuel Thibault int value, i;
526a5c94d9SSamuel Thibault struct st_key *this;
53*e68a558fSSamuel Thibault const char *dir_name, *spk_dir_name;
546a5c94d9SSamuel Thibault char *cp;
556a5c94d9SSamuel Thibault
566a5c94d9SSamuel Thibault dir_name = getenv("TOPDIR");
576a5c94d9SSamuel Thibault if (!dir_name)
586a5c94d9SSamuel Thibault dir_name = ".";
59*e68a558fSSamuel Thibault spk_dir_name = getenv("SPKDIR");
60*e68a558fSSamuel Thibault if (!spk_dir_name)
61*e68a558fSSamuel Thibault spk_dir_name = "drivers/accessibility/speakup";
626a5c94d9SSamuel Thibault bzero(key_table, sizeof(key_table));
636a5c94d9SSamuel Thibault add_key("shift", 1, is_shift);
646a5c94d9SSamuel Thibault add_key("altgr", 2, is_shift);
656a5c94d9SSamuel Thibault add_key("ctrl", 4, is_shift);
666a5c94d9SSamuel Thibault add_key("alt", 8, is_shift);
676a5c94d9SSamuel Thibault add_key("spk", 16, is_shift);
686a5c94d9SSamuel Thibault add_key("double", 32, is_shift);
696a5c94d9SSamuel Thibault
706a5c94d9SSamuel Thibault open_input(dir_name, "include/linux/input.h");
716a5c94d9SSamuel Thibault while (get_define()) {
726a5c94d9SSamuel Thibault if (strncmp(def_name, "KEY_", 4))
736a5c94d9SSamuel Thibault continue;
746a5c94d9SSamuel Thibault value = atoi(def_val);
756a5c94d9SSamuel Thibault if (value > 0 && value < MAXKEYVAL)
766a5c94d9SSamuel Thibault add_key(def_name, value, is_input);
776a5c94d9SSamuel Thibault }
786a5c94d9SSamuel Thibault
796a5c94d9SSamuel Thibault open_input(dir_name, "include/uapi/linux/input-event-codes.h");
806a5c94d9SSamuel Thibault while (get_define()) {
816a5c94d9SSamuel Thibault if (strncmp(def_name, "KEY_", 4))
826a5c94d9SSamuel Thibault continue;
836a5c94d9SSamuel Thibault value = atoi(def_val);
846a5c94d9SSamuel Thibault if (value > 0 && value < MAXKEYVAL)
856a5c94d9SSamuel Thibault add_key(def_name, value, is_input);
866a5c94d9SSamuel Thibault }
876a5c94d9SSamuel Thibault
88*e68a558fSSamuel Thibault open_input(spk_dir_name, "spk_priv_keyinfo.h");
896a5c94d9SSamuel Thibault while (get_define()) {
906a5c94d9SSamuel Thibault if (strlen(def_val) > 5) {
916a5c94d9SSamuel Thibault //if (def_val[0] == '(')
926a5c94d9SSamuel Thibault // def_val++;
936a5c94d9SSamuel Thibault cp = strchr(def_val, '+');
946a5c94d9SSamuel Thibault if (!cp)
956a5c94d9SSamuel Thibault continue;
966a5c94d9SSamuel Thibault if (cp[-1] == ' ')
976a5c94d9SSamuel Thibault cp[-1] = '\0';
986a5c94d9SSamuel Thibault *cp++ = '\0';
996a5c94d9SSamuel Thibault this = find_key(def_val);
1006a5c94d9SSamuel Thibault while (*cp == ' ')
1016a5c94d9SSamuel Thibault cp++;
1026a5c94d9SSamuel Thibault if (!this || *cp < '0' || *cp > '9')
1036a5c94d9SSamuel Thibault continue;
1046a5c94d9SSamuel Thibault value = this->value+atoi(cp);
1056a5c94d9SSamuel Thibault } else if (!strncmp(def_val, "0x", 2))
1066a5c94d9SSamuel Thibault sscanf(def_val+2, "%x", &value);
1076a5c94d9SSamuel Thibault else if (*def_val >= '0' && *def_val <= '9')
1086a5c94d9SSamuel Thibault value = atoi(def_val);
1096a5c94d9SSamuel Thibault else
1106a5c94d9SSamuel Thibault continue;
1116a5c94d9SSamuel Thibault add_key(def_name, value, is_spk);
1126a5c94d9SSamuel Thibault }
1136a5c94d9SSamuel Thibault
1146a5c94d9SSamuel Thibault printf("struct st_key_init init_key_data[] = {\n");
1156a5c94d9SSamuel Thibault for (i = 0; i < HASHSIZE; i++) {
1166a5c94d9SSamuel Thibault this = &key_table[i];
1176a5c94d9SSamuel Thibault if (!this->name)
1186a5c94d9SSamuel Thibault continue;
1196a5c94d9SSamuel Thibault do {
1206a5c94d9SSamuel Thibault printf("\t{ \"%s\", %d, %d, },\n", this->name, this->value, this->shift);
1216a5c94d9SSamuel Thibault this = this->next;
1226a5c94d9SSamuel Thibault } while (this);
1236a5c94d9SSamuel Thibault }
1246a5c94d9SSamuel Thibault printf("\t{ \".\", 0, 0 }\n};\n");
1256a5c94d9SSamuel Thibault
1266a5c94d9SSamuel Thibault exit(0);
1276a5c94d9SSamuel Thibault }
128