Path: blob/master/drivers/accessibility/speakup/genmap.c
26282 views
// SPDX-License-Identifier: GPL-2.0+1/* genmap.c2* originally written by: Kirk Reiser.3*4** Copyright (C) 2002 Kirk Reiser.5* Copyright (C) 2003 David Borowski.6*/78#include <stdlib.h>9#include <stdio.h>10#include <libgen.h>11#include <string.h>12#include <ctype.h>13#include "utils.h"1415struct st_key_init {16char *name;17int value, shift;18};1920static unsigned char key_data[MAXKEYVAL][16], *kp;2122#include "mapdata.h"2324static const char delims[] = "\t\n ";25static char *cp;26static int map_ver = 119; /* an arbitrary number so speakup can check */27static int shift_table[17];28static int max_states = 1, flags;29/* flags reserved for later, maybe for individual console maps */3031static int get_shift_value(int state)32{33int i;3435for (i = 0; shift_table[i] != state; i++) {36if (shift_table[i] == -1) {37if (i >= 16)38oops("too many shift states", NULL);39shift_table[i] = state;40max_states = i+1;41break;42}43}44return i;45}4647int48main(int argc, char *argv[])49{50int value, shift_state, i, spk_val = 0, lock_val = 0;51int max_key_used = 0, num_keys_used = 0;52struct st_key *this;53struct st_key_init *p_init;54char buffer[256];5556bzero(key_table, sizeof(key_table));57bzero(key_data, sizeof(key_data));5859shift_table[0] = 0;60for (i = 1; i <= 16; i++)61shift_table[i] = -1;6263if (argc < 2) {64fputs("usage: genmap filename\n", stderr);65exit(1);66}6768for (p_init = init_key_data; p_init->name[0] != '.'; p_init++)69add_key(p_init->name, p_init->value, p_init->shift);7071open_input(NULL, argv[1]);72while (fgets(buffer, sizeof(buffer), infile)) {73lc++;74value = shift_state = 0;7576cp = strtok(buffer, delims);77if (*cp == '#')78continue;7980while (cp) {81if (*cp == '=')82break;83this = find_key(cp);84if (this == NULL)85oops("unknown key/modifier", cp);86if (this->shift == is_shift) {87if (value)88oops("modifiers must come first", cp);89shift_state += this->value;90} else if (this->shift == is_input)91value = this->value;92else93oops("bad modifier or key", cp);94cp = strtok(0, delims);95}96if (!cp)97oops("no = found", NULL);9899cp = strtok(0, delims);100if (!cp)101oops("no speakup function after =", NULL);102103this = find_key(cp);104if (this == NULL || this->shift != is_spk)105oops("invalid speakup function", cp);106107i = get_shift_value(shift_state);108if (key_data[value][i]) {109while (--cp > buffer)110if (!*cp)111*cp = ' ';112oops("two functions on same key combination", cp);113}114key_data[value][i] = (char)this->value;115if (value > max_key_used)116max_key_used = value;117}118fclose(infile);119120this = find_key("spk_key");121if (this)122spk_val = this->value;123124this = find_key("spk_lock");125if (this)126lock_val = this->value;127128for (lc = 1; lc <= max_key_used; lc++) {129kp = key_data[lc];130if (!memcmp(key_data[0], kp, 16))131continue;132num_keys_used++;133for (i = 0; i < max_states; i++) {134if (kp[i] != spk_val && kp[i] != lock_val)135continue;136shift_state = shift_table[i];137if (shift_state&16)138continue;139shift_state = get_shift_value(shift_state+16);140kp[shift_state] = kp[i];141/* fill in so we can process the key up, as spk bit will be set */142}143}144145printf("\t%d, %d, %d,\n\t", map_ver, num_keys_used, max_states);146for (i = 0; i < max_states; i++)147printf("%d, ", shift_table[i]);148printf("%d,", flags);149for (lc = 1; lc <= max_key_used; lc++) {150kp = key_data[lc];151if (!memcmp(key_data[0], kp, 16))152continue;153printf("\n\t%d,", lc);154for (i = 0; i < max_states; i++)155printf(" %d,", (unsigned int)kp[i]);156}157printf("\n\t0, %d\n", map_ver);158159exit(0);160}161162163