1*29998Sminshall /*
2*29998Sminshall  * This program scans a file which describes a keyboard.  The output
3*29998Sminshall  * of the program is a series of 'C' declarations which describe a
4*29998Sminshall  * mapping between (scancode, shiftstate, altstate) and 3270 functions,
5*29998Sminshall  * characters, and AIDs.
6*29998Sminshall  *
7*29998Sminshall  * The format of the input file is as follows:
8*29998Sminshall  *
9*29998Sminshall  * keynumber [ scancode [ unshifted [ shifted [ alted [ shiftalted ] ] ] ] ]
10*29998Sminshall  *
11*29998Sminshall  * keynumber is in decimal, and starts in column 1.
12*29998Sminshall  * scancode is hexadecimal.
13*29998Sminshall  * unshifted, etc. - these are either a single ascii character,
14*29998Sminshall  *			or the name of a function or an AID-generating key.
15*29998Sminshall  *
16*29998Sminshall  * all fields are separated by a single space.
17*29998Sminshall  */
18*29998Sminshall 
19*29998Sminshall #include <stdio.h>
20*29998Sminshall #include <string.h>
21*29998Sminshall #include <ctype.h>
22*29998Sminshall 
23*29998Sminshall #define	LETS_SEE_ASCII
24*29998Sminshall #include "../m4.out"
25*29998Sminshall #undef	LETS_SEE_ASCII
26*29998Sminshall 
27*29998Sminshall #include "../ascebc.h"
28*29998Sminshall #include "../ebc_disp.h"
29*29998Sminshall #include "../kbd3270.h"
30*29998Sminshall 
31*29998Sminshall #include "dohits.h"
32*29998Sminshall 
33*29998Sminshall 
34*29998Sminshall void
35*29998Sminshall main()
36*29998Sminshall {
37*29998Sminshall     int scancode;
38*29998Sminshall     int empty;
39*29998Sminshall     int i;
40*29998Sminshall     int found;
41*29998Sminshall     struct hits *ph;
42*29998Sminshall     struct Hits *Ph;
43*29998Sminshall     TC_Ascii_t *TC;
44*29998Sminshall     struct thing *this;
45*29998Sminshall 
46*29998Sminshall     dohits();		/* Set up "Hits" */
47*29998Sminshall 
48*29998Sminshall     printf("struct tctokbd {\n\tenum { cantdo, normal, shifted, alted,");
49*29998Sminshall     printf(" shiftalted } shift;\n\tunsigned char scancode;");
50*29998Sminshall     printf("\n} tctokbd[] = {\n");
51*29998Sminshall     for (TC = &TC_Ascii[TC_LOWEST_USER-TC_LOWEST];
52*29998Sminshall 		TC <= &TC_Ascii[TC_HIGHEST-TC_LOWEST]; TC++) {
53*29998Sminshall 	/* Hack for "PFK" names (which should be "PF") */
54*29998Sminshall 	if (memcmp(TC->tc_name, "PFK", 3) == 0) {
55*29998Sminshall 	    static char PFonly[100] = "PF";
56*29998Sminshall 
57*29998Sminshall 	    strcpy(PFonly+2, TC->tc_name+3);
58*29998Sminshall 	    TC->tc_name = PFonly;
59*29998Sminshall 	}
60*29998Sminshall 	found = 0;
61*29998Sminshall 	for (this = firstentry(TC->tc_name); (!found) && this;
62*29998Sminshall 							this = this->next) {
63*29998Sminshall 	    if ((this->name[4] == TC->tc_name[0])
64*29998Sminshall 			&& (strcmp(this->name+4, TC->tc_name) == 0)) {
65*29998Sminshall 		/* this is the entry */
66*29998Sminshall 		/* What we have is a TC entry matching a scancode entry */
67*29998Sminshall 		Ph = this->hits;		/* now, get hits */
68*29998Sminshall 		if (Ph == 0) {
69*29998Sminshall 		    continue;
70*29998Sminshall 		}
71*29998Sminshall 		for (i = 0; i < 4; i++) {
72*29998Sminshall 		    if ((Ph->name[i][4] == TC->tc_name[0])
73*29998Sminshall 			    && (strcmp(Ph->name[i]+4, TC->tc_name) == 0)) {
74*29998Sminshall 			/* This is THE hit! */
75*29998Sminshall 			found = 1;
76*29998Sminshall 			printf("\t{ ");
77*29998Sminshall 			switch (i) {
78*29998Sminshall 			case 0:
79*29998Sminshall 			    printf("normal, ");
80*29998Sminshall 			    break;
81*29998Sminshall 			case 1:
82*29998Sminshall 			    printf("shifted, ");
83*29998Sminshall 			    break;
84*29998Sminshall 			case 2:
85*29998Sminshall 			    printf("alted, ");
86*29998Sminshall 			    break;
87*29998Sminshall 			case 3:
88*29998Sminshall 			    printf("shitfalted, ");
89*29998Sminshall 			    break;
90*29998Sminshall 			}
91*29998Sminshall 			printf("0x%x },\n", Ph-Hits);
92*29998Sminshall 		    }
93*29998Sminshall 		}
94*29998Sminshall 	    }
95*29998Sminshall 	}
96*29998Sminshall 	if (!found) {
97*29998Sminshall 	    printf("\t{ cantdo, 0 },\n");
98*29998Sminshall 	    fprintf(stderr, "Unable to produce TC_%s with scan codes!\n",
99*29998Sminshall 				TC->tc_name);
100*29998Sminshall 	}
101*29998Sminshall     }
102*29998Sminshall     printf("};\n");
103*29998Sminshall }
104