xref: /openbmc/linux/drivers/accessibility/speakup/makemapdata.c (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
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