1fdd4e1e0SJan Lentfer /****************************************************************************
2*32bb5217SDaniel Fojt * Copyright 2020 Thomas E. Dickey *
3*32bb5217SDaniel Fojt * Copyright 1998-2011,2015 Free Software Foundation, Inc. *
4fdd4e1e0SJan Lentfer * *
5fdd4e1e0SJan Lentfer * Permission is hereby granted, free of charge, to any person obtaining a *
6fdd4e1e0SJan Lentfer * copy of this software and associated documentation files (the *
7fdd4e1e0SJan Lentfer * "Software"), to deal in the Software without restriction, including *
8fdd4e1e0SJan Lentfer * without limitation the rights to use, copy, modify, merge, publish, *
9fdd4e1e0SJan Lentfer * distribute, distribute with modifications, sublicense, and/or sell *
10fdd4e1e0SJan Lentfer * copies of the Software, and to permit persons to whom the Software is *
11fdd4e1e0SJan Lentfer * furnished to do so, subject to the following conditions: *
12fdd4e1e0SJan Lentfer * *
13fdd4e1e0SJan Lentfer * The above copyright notice and this permission notice shall be included *
14fdd4e1e0SJan Lentfer * in all copies or substantial portions of the Software. *
15fdd4e1e0SJan Lentfer * *
16fdd4e1e0SJan Lentfer * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
17fdd4e1e0SJan Lentfer * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
18fdd4e1e0SJan Lentfer * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
19fdd4e1e0SJan Lentfer * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
20fdd4e1e0SJan Lentfer * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
21fdd4e1e0SJan Lentfer * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
22fdd4e1e0SJan Lentfer * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
23fdd4e1e0SJan Lentfer * *
24fdd4e1e0SJan Lentfer * Except as contained in this notice, the name(s) of the above copyright *
25fdd4e1e0SJan Lentfer * holders shall not be used in advertising or otherwise to promote the *
26fdd4e1e0SJan Lentfer * sale, use or other dealings in this Software without prior written *
27fdd4e1e0SJan Lentfer * authorization. *
28fdd4e1e0SJan Lentfer ****************************************************************************/
29fdd4e1e0SJan Lentfer
30fdd4e1e0SJan Lentfer /****************************************************************************
311d102085SJan Lentfer * Author: Thomas E. Dickey 1997-on *
32fdd4e1e0SJan Lentfer ****************************************************************************/
33fdd4e1e0SJan Lentfer
34fdd4e1e0SJan Lentfer /*
35fdd4e1e0SJan Lentfer * This replaces an awk script which translated keys.list into keys.tries by
36fdd4e1e0SJan Lentfer * making the output show the indices into the TERMTYPE Strings array. Doing
37fdd4e1e0SJan Lentfer * it that way lets us cut down on the size of the init_keytry() function.
38fdd4e1e0SJan Lentfer */
391d102085SJan Lentfer
401d102085SJan Lentfer #define USE_TERMLIB 1
4100d8f3c4SJohn Marino #include <build.priv.h>
42fdd4e1e0SJan Lentfer
43*32bb5217SDaniel Fojt MODULE_ID("$Id: make_keys.c,v 1.22 2020/02/02 23:34:34 tom Exp $")
44fdd4e1e0SJan Lentfer
45fdd4e1e0SJan Lentfer #include <names.c>
46fdd4e1e0SJan Lentfer
473468e90cSJohn Marino static unsigned
unknown(void)483468e90cSJohn Marino unknown(void)
493468e90cSJohn Marino {
503468e90cSJohn Marino static unsigned result = 0;
513468e90cSJohn Marino
523468e90cSJohn Marino if (result == 0) {
533468e90cSJohn Marino unsigned n;
543468e90cSJohn Marino for (n = 0; strnames[n] != 0; n++) {
553468e90cSJohn Marino ++result;
563468e90cSJohn Marino }
573468e90cSJohn Marino for (n = 0; strfnames[n] != 0; n++) {
583468e90cSJohn Marino ++result;
593468e90cSJohn Marino }
603468e90cSJohn Marino }
613468e90cSJohn Marino return result;
623468e90cSJohn Marino }
63fdd4e1e0SJan Lentfer
6400d8f3c4SJohn Marino static unsigned
lookup(const char * name)65fdd4e1e0SJan Lentfer lookup(const char *name)
66fdd4e1e0SJan Lentfer {
6700d8f3c4SJohn Marino unsigned n;
68fdd4e1e0SJan Lentfer bool found = FALSE;
69fdd4e1e0SJan Lentfer for (n = 0; strnames[n] != 0; n++) {
70fdd4e1e0SJan Lentfer if (!strcmp(name, strnames[n])) {
71fdd4e1e0SJan Lentfer found = TRUE;
72fdd4e1e0SJan Lentfer break;
73fdd4e1e0SJan Lentfer }
74fdd4e1e0SJan Lentfer }
75fdd4e1e0SJan Lentfer if (!found) {
76fdd4e1e0SJan Lentfer for (n = 0; strfnames[n] != 0; n++) {
77fdd4e1e0SJan Lentfer if (!strcmp(name, strfnames[n])) {
78fdd4e1e0SJan Lentfer found = TRUE;
79fdd4e1e0SJan Lentfer break;
80fdd4e1e0SJan Lentfer }
81fdd4e1e0SJan Lentfer }
82fdd4e1e0SJan Lentfer }
833468e90cSJohn Marino return found ? n : unknown();
84fdd4e1e0SJan Lentfer }
85fdd4e1e0SJan Lentfer
86fdd4e1e0SJan Lentfer static void
make_keys(FILE * ifp,FILE * ofp)87fdd4e1e0SJan Lentfer make_keys(FILE *ifp, FILE *ofp)
88fdd4e1e0SJan Lentfer {
89fdd4e1e0SJan Lentfer char buffer[BUFSIZ];
901d102085SJan Lentfer char from[256];
911d102085SJan Lentfer char to[256];
923468e90cSJohn Marino unsigned ignore = unknown();
9300d8f3c4SJohn Marino unsigned maxlen = 16;
941d102085SJan Lentfer int scanned;
95fdd4e1e0SJan Lentfer
963468e90cSJohn Marino while (fgets(buffer, (int) sizeof(buffer), ifp) != 0) {
97fdd4e1e0SJan Lentfer if (*buffer == '#')
98fdd4e1e0SJan Lentfer continue;
991d102085SJan Lentfer
1001d102085SJan Lentfer to[sizeof(to) - 1] = '\0';
1011d102085SJan Lentfer from[sizeof(from) - 1] = '\0';
1021d102085SJan Lentfer
1031d102085SJan Lentfer scanned = sscanf(buffer, "%255s %255s", to, from);
1041d102085SJan Lentfer if (scanned == 2) {
10500d8f3c4SJohn Marino unsigned code = lookup(from);
1063468e90cSJohn Marino if (code == ignore)
107fdd4e1e0SJan Lentfer continue;
10800d8f3c4SJohn Marino if (strlen(from) > maxlen)
10900d8f3c4SJohn Marino maxlen = (unsigned) strlen(from);
11000d8f3c4SJohn Marino fprintf(ofp, "\t{ %4u, %-*.*s },\t/* %s */\n",
111fdd4e1e0SJan Lentfer code,
11200d8f3c4SJohn Marino (int) maxlen, (int) maxlen,
113fdd4e1e0SJan Lentfer to,
114fdd4e1e0SJan Lentfer from);
115fdd4e1e0SJan Lentfer }
116fdd4e1e0SJan Lentfer }
117fdd4e1e0SJan Lentfer }
118fdd4e1e0SJan Lentfer
119fdd4e1e0SJan Lentfer static void
write_list(FILE * ofp,const char ** list)120fdd4e1e0SJan Lentfer write_list(FILE *ofp, const char **list)
121fdd4e1e0SJan Lentfer {
122fdd4e1e0SJan Lentfer while (*list != 0)
123fdd4e1e0SJan Lentfer fprintf(ofp, "%s\n", *list++);
124fdd4e1e0SJan Lentfer }
125fdd4e1e0SJan Lentfer
126fdd4e1e0SJan Lentfer int
main(int argc,char * argv[])127fdd4e1e0SJan Lentfer main(int argc, char *argv[])
128fdd4e1e0SJan Lentfer {
129fdd4e1e0SJan Lentfer static const char *prefix[] =
130fdd4e1e0SJan Lentfer {
131fdd4e1e0SJan Lentfer "#ifndef NCU_KEYS_H",
132fdd4e1e0SJan Lentfer "#define NCU_KEYS_H 1",
133fdd4e1e0SJan Lentfer "",
134fdd4e1e0SJan Lentfer "/* This file was generated by MAKE_KEYS */",
135fdd4e1e0SJan Lentfer "",
136fdd4e1e0SJan Lentfer "#if BROKEN_LINKER",
137fdd4e1e0SJan Lentfer "static",
138fdd4e1e0SJan Lentfer "#endif",
1391d102085SJan Lentfer "const struct tinfo_fkeys _nc_tinfo_fkeys[] = {",
140fdd4e1e0SJan Lentfer 0
141fdd4e1e0SJan Lentfer };
142fdd4e1e0SJan Lentfer static const char *suffix[] =
143fdd4e1e0SJan Lentfer {
144fdd4e1e0SJan Lentfer "\t{ 0, 0} };",
145fdd4e1e0SJan Lentfer "",
146fdd4e1e0SJan Lentfer "#endif /* NCU_KEYS_H */",
147fdd4e1e0SJan Lentfer 0
148fdd4e1e0SJan Lentfer };
149fdd4e1e0SJan Lentfer
150fdd4e1e0SJan Lentfer write_list(stdout, prefix);
151fdd4e1e0SJan Lentfer if (argc > 1) {
152fdd4e1e0SJan Lentfer int n;
153fdd4e1e0SJan Lentfer for (n = 1; n < argc; n++) {
154fdd4e1e0SJan Lentfer FILE *fp = fopen(argv[n], "r");
155fdd4e1e0SJan Lentfer if (fp != 0) {
156fdd4e1e0SJan Lentfer make_keys(fp, stdout);
157fdd4e1e0SJan Lentfer fclose(fp);
158fdd4e1e0SJan Lentfer }
159fdd4e1e0SJan Lentfer }
160fdd4e1e0SJan Lentfer } else {
161fdd4e1e0SJan Lentfer make_keys(stdin, stdout);
162fdd4e1e0SJan Lentfer }
163fdd4e1e0SJan Lentfer write_list(stdout, suffix);
164fdd4e1e0SJan Lentfer return EXIT_SUCCESS;
165fdd4e1e0SJan Lentfer }
166