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