129996Sminshall /*
229996Sminshall  * This program scans a file which describes a keyboard.  The output
329996Sminshall  * of the program is a series of 'C' declarations which describe a
429996Sminshall  * mapping between (scancode, shiftstate, altstate) and 3270 functions,
529996Sminshall  * characters, and AIDs.
629996Sminshall  *
729996Sminshall  * The format of the input file is as follows:
829996Sminshall  *
929996Sminshall  * keynumber [ scancode [ unshifted [ shifted [ alted [ shiftalted ] ] ] ] ]
1029996Sminshall  *
1129996Sminshall  * keynumber is in decimal, and starts in column 1.
1229996Sminshall  * scancode is hexadecimal.
1329996Sminshall  * unshifted, etc. - these are either a single ascii character,
1429996Sminshall  *			or the name of a function or an AID-generating key.
1529996Sminshall  *
1629996Sminshall  * all fields are separated by a single space.
1729996Sminshall  */
1829996Sminshall 
1929996Sminshall #include <stdio.h>
20*31065Sminshall #include <strings.h>
2129996Sminshall #include <ctype.h>
2230052Sminshall #include "../ascii/ascebc.h"
2330052Sminshall #include "../ctlr/ebc_disp.h"
2430052Sminshall #include "../ctlr/function.h"
2529996Sminshall 
2629996Sminshall #include "dohits.h"
2729996Sminshall 
2829996Sminshall 
2929996Sminshall void
3030077Sminshall main(argc, argv)
3130077Sminshall int	argc;
3230077Sminshall char	*argv[];
3329996Sminshall {
3429996Sminshall     int scancode;
3529996Sminshall     int empty;
3629996Sminshall     int i;
3729996Sminshall     struct hits *ph;
3829996Sminshall     struct Hits *Ph;
3930077Sminshall     char *aidfile = 0, *fcnfile = 0;
4029996Sminshall 
4130077Sminshall     if (argc > 1) {
4230077Sminshall 	if (argv[1][0] != '-') {
4330077Sminshall 	    aidfile = argv[1];
4430077Sminshall 	}
4530077Sminshall     }
4630077Sminshall     if (argc > 2) {
4730077Sminshall 	if (argv[2][0] != '-') {
4830077Sminshall 	    fcnfile = argv[2];
4930077Sminshall 	}
5030077Sminshall     }
5129996Sminshall 
5230077Sminshall     dohits(aidfile, fcnfile);		/* Set up "Hits" */
5330077Sminshall 
5429996Sminshall     printf("struct hits hits[] = {\n");
5529996Sminshall     empty = 0;
5629996Sminshall     scancode = -1;
5729996Sminshall     for (Ph = Hits; Ph < Hits+(sizeof Hits/sizeof Hits[0]); Ph++) {
5829996Sminshall 	ph = &Ph->hits;
5929996Sminshall 	scancode++;
6030077Sminshall 	if ((ph->hit[0].ctlrfcn == undefined)
6130077Sminshall 		&& (ph->hit[1].ctlrfcn == undefined)
6230077Sminshall 		&& (ph->hit[2].ctlrfcn == undefined)
6330077Sminshall 		&& (ph->hit[3].ctlrfcn == undefined)) {
6429996Sminshall 	    empty++;
6529996Sminshall 	    continue;
6629996Sminshall 	} else {
6729996Sminshall 	    while (empty) {
6830077Sminshall 		printf("\t{ 0, {  {undefined}, {undefined}");
6930077Sminshall 		printf(", {undefined}, {undefined}  } },\n");
7029996Sminshall 		empty--;
7129996Sminshall 	    }
7229996Sminshall 	}
7329996Sminshall 	printf("\t{ %d, {\t/* 0x%02x */\n\t", ph->keynumber, scancode);
7429996Sminshall 	for (i = 0; i < 4; i++) {
7529996Sminshall 	    printf("\t{ ");
7630077Sminshall 	    switch (ph->hit[i].ctlrfcn) {
7729996Sminshall 	    case undefined:
7830077Sminshall 		printf("undefined");
7929996Sminshall 		break;
8030077Sminshall 	    case FCN_CHARACTER:
8130077Sminshall 		printf("FCN_CHARACTER, 0x%02x", ph->hit[i].code);
8229996Sminshall 		break;
8330077Sminshall 	    case FCN_AID:
8430077Sminshall 		printf("FCN_AID, %s", Ph->name[i]);
8529996Sminshall 		break;
8630077Sminshall 	    case FCN_NULL:
8730077Sminshall 	    default:
8830077Sminshall 		if ((Ph->name[i] != 0)
8930077Sminshall 				    && (strcmp(Ph->name[i], "FCN_NULL") != 0)) {
9030077Sminshall 		    printf("%s", Ph->name[i]);
9130077Sminshall 		} else {
9230077Sminshall 		    printf("undefined");
9330077Sminshall 		}
9429996Sminshall 		break;
9529996Sminshall 	    }
9629996Sminshall 	    printf(" },\n\t");
9729996Sminshall 	}
9829996Sminshall 	printf("} },\n");
9929996Sminshall     }
10029996Sminshall     printf("};\n");
10129996Sminshall }
102