162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+
262306a36Sopenharmony_ci/* makemapdata.c
362306a36Sopenharmony_ci * originally written by: Kirk Reiser.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci ** Copyright (C) 2002  Kirk Reiser.
662306a36Sopenharmony_ci *  Copyright (C) 2003  David Borowski.
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <stdlib.h>
1062306a36Sopenharmony_ci#include <stdio.h>
1162306a36Sopenharmony_ci#include <libgen.h>
1262306a36Sopenharmony_ci#include <string.h>
1362306a36Sopenharmony_ci#include <linux/version.h>
1462306a36Sopenharmony_ci#include <ctype.h>
1562306a36Sopenharmony_ci#include "utils.h"
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cistatic char buffer[256];
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cistatic int get_define(void)
2062306a36Sopenharmony_ci{
2162306a36Sopenharmony_ci	char *c;
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci	while (fgets(buffer, sizeof(buffer)-1, infile)) {
2462306a36Sopenharmony_ci		lc++;
2562306a36Sopenharmony_ci		if (strncmp(buffer, "#define", 7))
2662306a36Sopenharmony_ci			continue;
2762306a36Sopenharmony_ci		c = buffer + 7;
2862306a36Sopenharmony_ci		while (*c == ' ' || *c == '\t')
2962306a36Sopenharmony_ci			c++;
3062306a36Sopenharmony_ci		def_name = c;
3162306a36Sopenharmony_ci		while (*c && *c != ' ' && *c != '\t' && *c != '\n')
3262306a36Sopenharmony_ci			c++;
3362306a36Sopenharmony_ci		if (!*c || *c == '\n')
3462306a36Sopenharmony_ci			continue;
3562306a36Sopenharmony_ci		*c++ = '\0';
3662306a36Sopenharmony_ci		while (*c == ' ' || *c == '\t' || *c == '(')
3762306a36Sopenharmony_ci			c++;
3862306a36Sopenharmony_ci		def_val = c;
3962306a36Sopenharmony_ci		while (*c && *c != '\n' && *c != ')')
4062306a36Sopenharmony_ci			c++;
4162306a36Sopenharmony_ci		*c++ = '\0';
4262306a36Sopenharmony_ci		return 1;
4362306a36Sopenharmony_ci	}
4462306a36Sopenharmony_ci	fclose(infile);
4562306a36Sopenharmony_ci	infile = 0;
4662306a36Sopenharmony_ci	return 0;
4762306a36Sopenharmony_ci}
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ciint
5062306a36Sopenharmony_cimain(int argc, char *argv[])
5162306a36Sopenharmony_ci{
5262306a36Sopenharmony_ci	int value, i;
5362306a36Sopenharmony_ci	struct st_key *this;
5462306a36Sopenharmony_ci	const char *dir_name, *spk_dir_name;
5562306a36Sopenharmony_ci	char *cp;
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci	dir_name = getenv("TOPDIR");
5862306a36Sopenharmony_ci	if (!dir_name)
5962306a36Sopenharmony_ci		dir_name = ".";
6062306a36Sopenharmony_ci	spk_dir_name = getenv("SPKDIR");
6162306a36Sopenharmony_ci	if (!spk_dir_name)
6262306a36Sopenharmony_ci		spk_dir_name = "drivers/accessibility/speakup";
6362306a36Sopenharmony_ci	bzero(key_table, sizeof(key_table));
6462306a36Sopenharmony_ci	add_key("shift",	1, is_shift);
6562306a36Sopenharmony_ci	add_key("altgr",	2, is_shift);
6662306a36Sopenharmony_ci	add_key("ctrl",	4, is_shift);
6762306a36Sopenharmony_ci	add_key("alt",	8, is_shift);
6862306a36Sopenharmony_ci	add_key("spk", 16, is_shift);
6962306a36Sopenharmony_ci	add_key("double", 32, is_shift);
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci	open_input(dir_name, "include/linux/input.h");
7262306a36Sopenharmony_ci	while (get_define()) {
7362306a36Sopenharmony_ci		if (strncmp(def_name, "KEY_", 4))
7462306a36Sopenharmony_ci			continue;
7562306a36Sopenharmony_ci		value = atoi(def_val);
7662306a36Sopenharmony_ci		if (value > 0 && value < MAXKEYVAL)
7762306a36Sopenharmony_ci			add_key(def_name, value, is_input);
7862306a36Sopenharmony_ci	}
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci	open_input(dir_name, "include/uapi/linux/input-event-codes.h");
8162306a36Sopenharmony_ci	while (get_define()) {
8262306a36Sopenharmony_ci		if (strncmp(def_name, "KEY_", 4))
8362306a36Sopenharmony_ci			continue;
8462306a36Sopenharmony_ci		value = atoi(def_val);
8562306a36Sopenharmony_ci		if (value > 0 && value < MAXKEYVAL)
8662306a36Sopenharmony_ci			add_key(def_name, value, is_input);
8762306a36Sopenharmony_ci	}
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci	open_input(spk_dir_name, "spk_priv_keyinfo.h");
9062306a36Sopenharmony_ci	while (get_define()) {
9162306a36Sopenharmony_ci		if (strlen(def_val) > 5) {
9262306a36Sopenharmony_ci			//if (def_val[0] == '(')
9362306a36Sopenharmony_ci			//	def_val++;
9462306a36Sopenharmony_ci			cp = strchr(def_val, '+');
9562306a36Sopenharmony_ci			if (!cp)
9662306a36Sopenharmony_ci				continue;
9762306a36Sopenharmony_ci			if (cp[-1] == ' ')
9862306a36Sopenharmony_ci				cp[-1] = '\0';
9962306a36Sopenharmony_ci			*cp++ = '\0';
10062306a36Sopenharmony_ci			this = find_key(def_val);
10162306a36Sopenharmony_ci			while (*cp == ' ')
10262306a36Sopenharmony_ci				cp++;
10362306a36Sopenharmony_ci			if (!this || *cp < '0' || *cp > '9')
10462306a36Sopenharmony_ci				continue;
10562306a36Sopenharmony_ci			value = this->value+atoi(cp);
10662306a36Sopenharmony_ci		} else if (!strncmp(def_val, "0x", 2))
10762306a36Sopenharmony_ci			sscanf(def_val+2, "%x", &value);
10862306a36Sopenharmony_ci		else if (*def_val >= '0' && *def_val <= '9')
10962306a36Sopenharmony_ci			value = atoi(def_val);
11062306a36Sopenharmony_ci		else
11162306a36Sopenharmony_ci			continue;
11262306a36Sopenharmony_ci		add_key(def_name, value, is_spk);
11362306a36Sopenharmony_ci	}
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci	printf("struct st_key_init init_key_data[] = {\n");
11662306a36Sopenharmony_ci	for (i = 0; i < HASHSIZE; i++) {
11762306a36Sopenharmony_ci		this = &key_table[i];
11862306a36Sopenharmony_ci		if (!this->name)
11962306a36Sopenharmony_ci			continue;
12062306a36Sopenharmony_ci		do {
12162306a36Sopenharmony_ci			printf("\t{ \"%s\", %d, %d, },\n", this->name, this->value, this->shift);
12262306a36Sopenharmony_ci			this = this->next;
12362306a36Sopenharmony_ci		} while (this);
12462306a36Sopenharmony_ci	}
12562306a36Sopenharmony_ci	printf("\t{ \".\", 0, 0 }\n};\n");
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ci	exit(0);
12862306a36Sopenharmony_ci}
129