Merge tag 'sched_urgent_for_v6.1_rc6' of git://git.kernel.org/pub/scm/linux/kernel...
[platform/kernel/linux-starfive.git] / drivers / accessibility / speakup / utils.h
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /* utils.h
3  * originally written by: Kirk Reiser.
4  *
5  ** Copyright (C) 2002  Kirk Reiser.
6  *  Copyright (C) 2003  David Borowski.
7  */
8
9 #include <stdio.h>
10
11 #define MAXKEYS 512
12 #define MAXKEYVAL 160
13 #define HASHSIZE 101
14 #define is_shift -3
15 #define is_spk -2
16 #define is_input -1
17
18 struct st_key {
19         char *name;
20         struct st_key *next;
21         int value, shift;
22 };
23
24 struct st_key key_table[MAXKEYS];
25 struct st_key *extra_keys = key_table+HASHSIZE;
26 char *def_name, *def_val;
27 FILE *infile;
28 int lc;
29
30 char filename[256];
31
32 static inline void open_input(const char *dir_name, const char *name)
33 {
34         if (dir_name)
35                 snprintf(filename, sizeof(filename), "%s/%s", dir_name, name);
36         else
37                 snprintf(filename, sizeof(filename), "%s", name);
38         infile = fopen(filename, "r");
39         if (infile == 0) {
40                 fprintf(stderr, "can't open %s\n", filename);
41                 exit(1);
42         }
43         lc = 0;
44 }
45
46 static inline int oops(const char *msg, const char *info)
47 {
48         if (info == NULL)
49                 info = "";
50         fprintf(stderr, "error: file %s line %d\n", filename, lc);
51         fprintf(stderr, "%s %s\n", msg, info);
52         exit(1);
53 }
54
55 static inline struct st_key *hash_name(char *name)
56 {
57         unsigned char *pn = (unsigned char *)name;
58         int hash = 0;
59
60         while (*pn) {
61                 hash = (hash * 17) & 0xfffffff;
62                 if (isupper(*pn))
63                         *pn = tolower(*pn);
64                 hash += (int)*pn;
65                 pn++;
66         }
67         hash %= HASHSIZE;
68         return &key_table[hash];
69 }
70
71 static inline struct st_key *find_key(char *name)
72 {
73         struct st_key *this = hash_name(name);
74
75         while (this) {
76                 if (this->name && !strcmp(name, this->name))
77                         return this;
78                 this = this->next;
79         }
80         return this;
81 }
82
83 static inline struct st_key *add_key(char *name, int value, int shift)
84 {
85         struct st_key *this = hash_name(name);
86
87         if (extra_keys-key_table >= MAXKEYS)
88                 oops("out of key table space, enlarge MAXKEYS", NULL);
89         if (this->name != NULL) {
90                 while (this->next) {
91                         if (!strcmp(name, this->name))
92                                 oops("attempt to add duplicate key", name);
93                         this = this->next;
94                 }
95                 this->next = extra_keys++;
96                 this = this->next;
97         }
98         this->name = strdup(name);
99         this->value = value;
100         this->shift = shift;
101         return this;
102 }