1 /*-
2  * Copyright (c) 1988, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * %sccs.include.redist.c%
6  */
7 
8 #ifndef lint
9 static char copyright[] =
10 "@(#) Copyright (c) 1988, 1993\n\
11 	The Regents of the University of California.  All rights reserved.\n";
12 #endif /* not lint */
13 
14 #ifndef lint
15 static char sccsid[] = "@(#)mkhits.c	8.1 (Berkeley) 06/06/93";
16 #endif /* not lint */
17 
18 /*
19  * This program scans a file which describes a keyboard.  The output
20  * of the program is a series of 'C' declarations which describe a
21  * mapping between (scancode, shiftstate, altstate) and 3270 functions,
22  * characters, and AIDs.
23  *
24  * The format of the input file is as follows:
25  *
26  * keynumber [ scancode [ unshifted [ shifted [ alted [ shiftalted ] ] ] ] ]
27  *
28  * keynumber is in decimal, and starts in column 1.
29  * scancode is hexadecimal.
30  * unshifted, etc. - these are either a single ascii character,
31  *			or the name of a function or an AID-generating key.
32  *
33  * all fields are separated by a single space.
34  */
35 
36 #include <stdio.h>
37 #if	defined(unix)
38 #include <strings.h>
39 #else	/* defined(unix) */
40 #include <string.h>
41 #endif	/* defined(unix) */
42 #include <ctype.h>
43 #include "../ctlr/function.h"
44 
45 #include "dohits.h"
46 
47 
48 int
49 main(argc, argv)
50 int	argc;
51 char	*argv[];
52 {
53     int scancode;
54     int empty;
55     int i;
56     struct hits *ph;
57     struct Hits *Ph;
58     char *aidfile = 0, *fcnfile = 0;
59 
60     if (argc > 1) {
61 	if (argv[1][0] != '-') {
62 	    aidfile = argv[1];
63 	}
64     }
65     if (argc > 2) {
66 	if (argv[2][0] != '-') {
67 	    fcnfile = argv[2];
68 	}
69     }
70 
71     dohits(aidfile, fcnfile);		/* Set up "Hits" */
72 
73     printf("struct hits hits[] = {\n");
74     empty = 0;
75     scancode = -1;
76     for (Ph = Hits; Ph < Hits+(sizeof Hits/sizeof Hits[0]); Ph++) {
77 	ph = &Ph->hits;
78 	scancode++;
79 	if ((ph->hit[0].ctlrfcn == undefined)
80 		&& (ph->hit[1].ctlrfcn == undefined)
81 		&& (ph->hit[2].ctlrfcn == undefined)
82 		&& (ph->hit[3].ctlrfcn == undefined)) {
83 	    empty++;
84 	    continue;
85 	} else {
86 	    while (empty) {
87 		printf("\t{ 0, {  {undefined}, {undefined}");
88 		printf(", {undefined}, {undefined}  } },\n");
89 		empty--;
90 	    }
91 	}
92 	printf("\t{ %d, {\t/* 0x%02x */\n\t", ph->keynumber, scancode);
93 	for (i = 0; i < 4; i++) {
94 	    printf("\t{ ");
95 	    switch (ph->hit[i].ctlrfcn) {
96 	    case undefined:
97 		printf("undefined");
98 		break;
99 	    case FCN_CHARACTER:
100 		printf("FCN_CHARACTER, 0x%02x", ph->hit[i].code);
101 		break;
102 	    case FCN_AID:
103 		printf("FCN_AID, %s", Ph->name[i]);
104 		break;
105 	    case FCN_NULL:
106 	    default:
107 		if ((Ph->name[i] != 0)
108 				    && (strcmp(Ph->name[i], "FCN_NULL") != 0)) {
109 		    printf("%s", Ph->name[i]);
110 		} else {
111 		    printf("undefined");
112 		}
113 		break;
114 	    }
115 	    printf(" },\n\t");
116 	}
117 	printf("} },\n");
118     }
119     printf("};\n");
120     return 0;
121 }
122