forked from Minki/linux
6a5c94d926
speakupmap.h was not actually intended to be source code, speakupmap.map is. This resurrects the makemapdata.c and genmap.c tools to generate speakupmap.h automatically from the input and speakup headers, and the speakupmap.map keyboard mapping source file. Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org> Link: https://lore.kernel.org/r/20220612172244.il3siyq7ueqnvah5@begin Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
126 lines
2.7 KiB
C
126 lines
2.7 KiB
C
// SPDX-License-Identifier: GPL-2.0+
|
|
/* makemapdata.c
|
|
* originally written by: Kirk Reiser.
|
|
*
|
|
** Copyright (C) 2002 Kirk Reiser.
|
|
* Copyright (C) 2003 David Borowski.
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <libgen.h>
|
|
#include <string.h>
|
|
#include <linux/version.h>
|
|
#include <ctype.h>
|
|
#include "utils.h"
|
|
|
|
static char buffer[256];
|
|
|
|
static int get_define(void)
|
|
{
|
|
char *c;
|
|
|
|
while (fgets(buffer, sizeof(buffer)-1, infile)) {
|
|
lc++;
|
|
if (strncmp(buffer, "#define", 7))
|
|
continue;
|
|
c = buffer + 7;
|
|
while (*c == ' ' || *c == '\t')
|
|
c++;
|
|
def_name = c;
|
|
while (*c && *c != ' ' && *c != '\t' && *c != '\n')
|
|
c++;
|
|
if (!*c || *c == '\n')
|
|
continue;
|
|
*c++ = '\0';
|
|
while (*c == ' ' || *c == '\t' || *c == '(')
|
|
c++;
|
|
def_val = c;
|
|
while (*c && *c != '\n' && *c != ')')
|
|
c++;
|
|
*c++ = '\0';
|
|
return 1;
|
|
}
|
|
fclose(infile);
|
|
infile = 0;
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
main(int argc, char *argv[])
|
|
{
|
|
int value, i;
|
|
struct st_key *this;
|
|
const char *dir_name;
|
|
char *cp;
|
|
|
|
dir_name = getenv("TOPDIR");
|
|
if (!dir_name)
|
|
dir_name = ".";
|
|
bzero(key_table, sizeof(key_table));
|
|
add_key("shift", 1, is_shift);
|
|
add_key("altgr", 2, is_shift);
|
|
add_key("ctrl", 4, is_shift);
|
|
add_key("alt", 8, is_shift);
|
|
add_key("spk", 16, is_shift);
|
|
add_key("double", 32, is_shift);
|
|
|
|
open_input(dir_name, "include/linux/input.h");
|
|
while (get_define()) {
|
|
if (strncmp(def_name, "KEY_", 4))
|
|
continue;
|
|
value = atoi(def_val);
|
|
if (value > 0 && value < MAXKEYVAL)
|
|
add_key(def_name, value, is_input);
|
|
}
|
|
|
|
open_input(dir_name, "include/uapi/linux/input-event-codes.h");
|
|
while (get_define()) {
|
|
if (strncmp(def_name, "KEY_", 4))
|
|
continue;
|
|
value = atoi(def_val);
|
|
if (value > 0 && value < MAXKEYVAL)
|
|
add_key(def_name, value, is_input);
|
|
}
|
|
|
|
open_input(dir_name, "drivers/accessibility/speakup/spk_priv_keyinfo.h");
|
|
while (get_define()) {
|
|
if (strlen(def_val) > 5) {
|
|
//if (def_val[0] == '(')
|
|
// def_val++;
|
|
cp = strchr(def_val, '+');
|
|
if (!cp)
|
|
continue;
|
|
if (cp[-1] == ' ')
|
|
cp[-1] = '\0';
|
|
*cp++ = '\0';
|
|
this = find_key(def_val);
|
|
while (*cp == ' ')
|
|
cp++;
|
|
if (!this || *cp < '0' || *cp > '9')
|
|
continue;
|
|
value = this->value+atoi(cp);
|
|
} else if (!strncmp(def_val, "0x", 2))
|
|
sscanf(def_val+2, "%x", &value);
|
|
else if (*def_val >= '0' && *def_val <= '9')
|
|
value = atoi(def_val);
|
|
else
|
|
continue;
|
|
add_key(def_name, value, is_spk);
|
|
}
|
|
|
|
printf("struct st_key_init init_key_data[] = {\n");
|
|
for (i = 0; i < HASHSIZE; i++) {
|
|
this = &key_table[i];
|
|
if (!this->name)
|
|
continue;
|
|
do {
|
|
printf("\t{ \"%s\", %d, %d, },\n", this->name, this->value, this->shift);
|
|
this = this->next;
|
|
} while (this);
|
|
}
|
|
printf("\t{ \".\", 0, 0 }\n};\n");
|
|
|
|
exit(0);
|
|
}
|