1*29995Sminshall /*
2*29995Sminshall  * This program scans a file which describes a keyboard.  The output
3*29995Sminshall  * of the program is a series of 'C' declarations which describe a
4*29995Sminshall  * mapping between (scancode, shiftstate, altstate) and 3270 functions,
5*29995Sminshall  * characters, and AIDs.
6*29995Sminshall  *
7*29995Sminshall  * The format of the input file is as follows:
8*29995Sminshall  *
9*29995Sminshall  * keynumber [ scancode [ unshifted [ shifted [ alted [ shiftalted ] ] ] ] ]
10*29995Sminshall  *
11*29995Sminshall  * keynumber is in decimal, and starts in column 1.
12*29995Sminshall  * scancode is hexadecimal.
13*29995Sminshall  * unshifted, etc. - these are either a single ascii character,
14*29995Sminshall  *			or the name of a function or an AID-generating key.
15*29995Sminshall  *
16*29995Sminshall  * all fields are separated by a single space.
17*29995Sminshall  */
18*29995Sminshall 
19*29995Sminshall #include <stdio.h>
20*29995Sminshall #include <string.h>
21*29995Sminshall #include <ctype.h>
22*29995Sminshall #include "../ascebc.h"
23*29995Sminshall #include "../ebc_disp.h"
24*29995Sminshall #include "../kbd3270.h"
25*29995Sminshall 
26*29995Sminshall #include "dohits.h"
27*29995Sminshall 
28*29995Sminshall struct Hits Hits[256];		/* one for each of 0x00-0xff */
29*29995Sminshall 
30*29995Sminshall struct thing *table[100];
31*29995Sminshall 
32*29995Sminshall unsigned int
33*29995Sminshall dohash(seed, string)
34*29995Sminshall unsigned int seed;
35*29995Sminshall char *string;
36*29995Sminshall {
37*29995Sminshall     register unsigned int i = seed;
38*29995Sminshall     register unsigned char c;
39*29995Sminshall 
40*29995Sminshall     while (c = *string++) {
41*29995Sminshall 	if (c >= 0x60) {
42*29995Sminshall 	    c - = (0x60+0x20);
43*29995Sminshall 	} else {
44*29995Sminshall 	    c -= 0x20;
45*29995Sminshall 	}
46*29995Sminshall 	i = (i>>26) + (i<<6) + (c&0x3f);
47*29995Sminshall     }
48*29995Sminshall     return i;
49*29995Sminshall }
50*29995Sminshall 
51*29995Sminshall void
52*29995Sminshall add(first, second, value)
53*29995Sminshall {
54*29995Sminshall     struct thing **item, *this;
55*29995Sminshall 
56*29995Sminshall     item = &firstentry(second);
57*29995Sminshall     this = (struct thing *) malloc(sizeof *this);
58*29995Sminshall     this->next = *item;
59*29995Sminshall     *item = this;
60*29995Sminshall     this->value = value;
61*29995Sminshall     strcpy(this->name, first);
62*29995Sminshall     strcpy(this->name+strlen(this->name), second);
63*29995Sminshall }
64*29995Sminshall 
65*29995Sminshall void
66*29995Sminshall scan(file, prefix)
67*29995Sminshall char *file,		/* Name of file to scan */
68*29995Sminshall      *prefix;		/* prefix of what should be picked up */
69*29995Sminshall {
70*29995Sminshall     FILE *ourfile;
71*29995Sminshall     char compare[100];
72*29995Sminshall     char what[100], value[100];
73*29995Sminshall     char line[200];
74*29995Sminshall     int whatitis;
75*29995Sminshall 
76*29995Sminshall     sprintf(compare, "#define %s%%s %%s", prefix);
77*29995Sminshall     if ((ourfile = fopen(file, "r")) == NULL) {
78*29995Sminshall 	perror("fopen");
79*29995Sminshall 	exit(1);
80*29995Sminshall     }
81*29995Sminshall     while (!feof(ourfile)) {
82*29995Sminshall 	if (fscanf(ourfile, compare,  what, value) == 2) {
83*29995Sminshall 	    if (value[0] == '0') {
84*29995Sminshall 		if ((value[1] == 'x') || (value[1] == 'X')) {
85*29995Sminshall 		    sscanf(value, "0x%x", &whatitis);
86*29995Sminshall 		} else {
87*29995Sminshall 		    sscanf(value, "0%o", &whatitis);
88*29995Sminshall 		}
89*29995Sminshall 	    } else {
90*29995Sminshall 		sscanf(value, "%d", &whatitis);
91*29995Sminshall 	    }
92*29995Sminshall 	    add(prefix, what, whatitis);
93*29995Sminshall 	}
94*29995Sminshall 	do {
95*29995Sminshall 	    if (fgets(line, sizeof line, ourfile) == NULL) {
96*29995Sminshall 		if (!feof(ourfile)) {
97*29995Sminshall 		    perror("fgets");
98*29995Sminshall 		}
99*29995Sminshall 		break;
100*29995Sminshall 	    }
101*29995Sminshall 	} while (line[strlen(line)-1] != '\n');
102*29995Sminshall     }
103*29995Sminshall }
104*29995Sminshall 
105*29995Sminshall 
106*29995Sminshall char *
107*29995Sminshall doit(hit, type, hits)
108*29995Sminshall struct hit *hit;
109*29995Sminshall unsigned char *type;
110*29995Sminshall struct Hits *hits;
111*29995Sminshall {
112*29995Sminshall     struct thing *this;
113*29995Sminshall 
114*29995Sminshall     hit->type = illegal;
115*29995Sminshall     if (type[0] == 0) {
116*29995Sminshall 	return 0;
117*29995Sminshall     }
118*29995Sminshall     if (type[1] == 0) {		/* character */
119*29995Sminshall 	hit->type = character;
120*29995Sminshall 	hit->code = ebc_disp[ascebc[AE_IN][type[0]]];
121*29995Sminshall     } else {
122*29995Sminshall 	for (this = firstentry(type); this; this = this->next) {
123*29995Sminshall 	    if ((type[0] == this->name[4])
124*29995Sminshall 				&& (strcmp(type, this->name+4) == 0)) {
125*29995Sminshall 		this->hits = hits;
126*29995Sminshall 		if (this->name[0] == 'F') {
127*29995Sminshall 		    hit->type = function;
128*29995Sminshall 		} else {
129*29995Sminshall 		    hit->type = aid;
130*29995Sminshall 		}
131*29995Sminshall 		return this->name;
132*29995Sminshall 	    }
133*29995Sminshall 	}
134*29995Sminshall 	printf("Error: Unknown type %s.\n", type);
135*29995Sminshall 	return 0;
136*29995Sminshall     }
137*29995Sminshall }
138*29995Sminshall 
139*29995Sminshall 
140*29995Sminshall void
141*29995Sminshall dohits()
142*29995Sminshall {
143*29995Sminshall     unsigned char plain[100], shifted[100], alted[100], shiftalted[100];
144*29995Sminshall     unsigned char line[200];
145*29995Sminshall     int keynumber, scancode;
146*29995Sminshall     int empty;
147*29995Sminshall     int i;
148*29995Sminshall     struct hit *hit;
149*29995Sminshall     struct hits *ph;
150*29995Sminshall     struct Hits *Ph;
151*29995Sminshall 
152*29995Sminshall     memset((char *)Hits, 0, sizeof Hits);
153*29995Sminshall 
154*29995Sminshall     /*
155*29995Sminshall      * First, we read "host3270.h" to find the names/values of
156*29995Sminshall      * various AID; then we read kbd3270.h to find the names/values
157*29995Sminshall      * of various FCNs.
158*29995Sminshall      */
159*29995Sminshall 
160*29995Sminshall     scan("host3270.h", "AID_");
161*29995Sminshall     scan("kbd3270.h", "FCN_");
162*29995Sminshall 
163*29995Sminshall     while (gets(line) != NULL) {
164*29995Sminshall 	if (!isdigit(line[0])) {
165*29995Sminshall 	    continue;
166*29995Sminshall 	}
167*29995Sminshall 	plain[0] = shifted[0] = alted[0] = shiftalted[0] = 0;
168*29995Sminshall 	keynumber = -1;
169*29995Sminshall 	scancode = -1;
170*29995Sminshall 	(void) sscanf(line, "%d %x %s %s %s %s", &keynumber,
171*29995Sminshall 		    &scancode, plain, shifted, alted, shiftalted);
172*29995Sminshall 	if ((keynumber == -1) || (scancode == -1)
173*29995Sminshall 		|| ((plain[0] == 0)
174*29995Sminshall 		    && (shifted[0] == 0)
175*29995Sminshall 		    && (alted[0] == 0)
176*29995Sminshall 		    && (shiftalted[0] == 0))) {
177*29995Sminshall 	    continue;
178*29995Sminshall 	}
179*29995Sminshall 	if (scancode >= 256) {
180*29995Sminshall 	    printf("Error: scancode 0x%02x for keynumber %d\n", scancode,
181*29995Sminshall 		    keynumber);
182*29995Sminshall 	    break;
183*29995Sminshall 	}
184*29995Sminshall 	if (Hits[scancode].hits.hit[0].type != undefined) {
185*29995Sminshall 	    printf("Error: duplicate scancode 0x%02x for keynumber %d\n",
186*29995Sminshall 		    scancode, keynumber);
187*29995Sminshall 	    break;
188*29995Sminshall 	}
189*29995Sminshall 	hit = Hits[scancode].hits.hit;
190*29995Sminshall 	Hits[scancode].hits.keynumber = keynumber;
191*29995Sminshall 	Hits[scancode].name[0] = doit(hit, plain, &Hits[scancode]);
192*29995Sminshall 	Hits[scancode].name[1] = doit(hit+1, shifted, &Hits[scancode]);
193*29995Sminshall 	Hits[scancode].name[2] = doit(hit+2, alted, &Hits[scancode]);
194*29995Sminshall 	Hits[scancode].name[3] = doit(hit+3, shiftalted, &Hits[scancode]);
195*29995Sminshall     }
196*29995Sminshall }
197