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