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>
103 lines
2.0 KiB
C
103 lines
2.0 KiB
C
/* SPDX-License-Identifier: GPL-2.0+ */
|
|
/* utils.h
|
|
* originally written by: Kirk Reiser.
|
|
*
|
|
** Copyright (C) 2002 Kirk Reiser.
|
|
* Copyright (C) 2003 David Borowski.
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
|
|
#define MAXKEYS 512
|
|
#define MAXKEYVAL 160
|
|
#define HASHSIZE 101
|
|
#define is_shift -3
|
|
#define is_spk -2
|
|
#define is_input -1
|
|
|
|
struct st_key {
|
|
char *name;
|
|
struct st_key *next;
|
|
int value, shift;
|
|
};
|
|
|
|
struct st_key key_table[MAXKEYS];
|
|
struct st_key *extra_keys = key_table+HASHSIZE;
|
|
char *def_name, *def_val;
|
|
FILE *infile;
|
|
int lc;
|
|
|
|
char filename[256];
|
|
|
|
static inline void open_input(const char *dir_name, const char *name)
|
|
{
|
|
if (dir_name)
|
|
snprintf(filename, sizeof(filename), "%s/%s", dir_name, name);
|
|
else
|
|
snprintf(filename, sizeof(filename), "%s", name);
|
|
infile = fopen(filename, "r");
|
|
if (infile == 0) {
|
|
fprintf(stderr, "can't open %s\n", filename);
|
|
exit(1);
|
|
}
|
|
lc = 0;
|
|
}
|
|
|
|
static inline int oops(const char *msg, const char *info)
|
|
{
|
|
if (info == NULL)
|
|
info = "";
|
|
fprintf(stderr, "error: file %s line %d\n", filename, lc);
|
|
fprintf(stderr, "%s %s\n", msg, info);
|
|
exit(1);
|
|
}
|
|
|
|
static inline struct st_key *hash_name(char *name)
|
|
{
|
|
u_char *pn = (u_char *)name;
|
|
int hash = 0;
|
|
|
|
while (*pn) {
|
|
hash = (hash * 17) & 0xfffffff;
|
|
if (isupper(*pn))
|
|
*pn = tolower(*pn);
|
|
hash += (int)*pn;
|
|
pn++;
|
|
}
|
|
hash %= HASHSIZE;
|
|
return &key_table[hash];
|
|
}
|
|
|
|
static inline struct st_key *find_key(char *name)
|
|
{
|
|
struct st_key *this = hash_name(name);
|
|
|
|
while (this) {
|
|
if (this->name && !strcmp(name, this->name))
|
|
return this;
|
|
this = this->next;
|
|
}
|
|
return this;
|
|
}
|
|
|
|
static inline struct st_key *add_key(char *name, int value, int shift)
|
|
{
|
|
struct st_key *this = hash_name(name);
|
|
|
|
if (extra_keys-key_table >= MAXKEYS)
|
|
oops("out of key table space, enlarge MAXKEYS", NULL);
|
|
if (this->name != NULL) {
|
|
while (this->next) {
|
|
if (!strcmp(name, this->name))
|
|
oops("attempt to add duplicate key", name);
|
|
this = this->next;
|
|
}
|
|
this->next = extra_keys++;
|
|
this = this->next;
|
|
}
|
|
this->name = strdup(name);
|
|
this->value = value;
|
|
this->shift = shift;
|
|
return this;
|
|
}
|