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*31102Sminshall #if	defined(unix)
2131065Sminshall #include <strings.h>
22*31102Sminshall #else	/* defined(unix) */
23*31102Sminshall #include <string.h>
24*31102Sminshall #endif	/* defined(unix) */
2529996Sminshall #include <ctype.h>
2630052Sminshall #include "../ascii/ascebc.h"
2730052Sminshall #include "../ctlr/ebc_disp.h"
2830052Sminshall #include "../ctlr/function.h"
2929996Sminshall 
3029996Sminshall #include "dohits.h"
3129996Sminshall 
3229996Sminshall 
33*31102Sminshall int
3430077Sminshall main(argc, argv)
3530077Sminshall int	argc;
3630077Sminshall char	*argv[];
3729996Sminshall {
3829996Sminshall     int scancode;
3929996Sminshall     int empty;
4029996Sminshall     int i;
4129996Sminshall     struct hits *ph;
4229996Sminshall     struct Hits *Ph;
4330077Sminshall     char *aidfile = 0, *fcnfile = 0;
4429996Sminshall 
4530077Sminshall     if (argc > 1) {
4630077Sminshall 	if (argv[1][0] != '-') {
4730077Sminshall 	    aidfile = argv[1];
4830077Sminshall 	}
4930077Sminshall     }
5030077Sminshall     if (argc > 2) {
5130077Sminshall 	if (argv[2][0] != '-') {
5230077Sminshall 	    fcnfile = argv[2];
5330077Sminshall 	}
5430077Sminshall     }
5529996Sminshall 
5630077Sminshall     dohits(aidfile, fcnfile);		/* Set up "Hits" */
5730077Sminshall 
5829996Sminshall     printf("struct hits hits[] = {\n");
5929996Sminshall     empty = 0;
6029996Sminshall     scancode = -1;
6129996Sminshall     for (Ph = Hits; Ph < Hits+(sizeof Hits/sizeof Hits[0]); Ph++) {
6229996Sminshall 	ph = &Ph->hits;
6329996Sminshall 	scancode++;
6430077Sminshall 	if ((ph->hit[0].ctlrfcn == undefined)
6530077Sminshall 		&& (ph->hit[1].ctlrfcn == undefined)
6630077Sminshall 		&& (ph->hit[2].ctlrfcn == undefined)
6730077Sminshall 		&& (ph->hit[3].ctlrfcn == undefined)) {
6829996Sminshall 	    empty++;
6929996Sminshall 	    continue;
7029996Sminshall 	} else {
7129996Sminshall 	    while (empty) {
7230077Sminshall 		printf("\t{ 0, {  {undefined}, {undefined}");
7330077Sminshall 		printf(", {undefined}, {undefined}  } },\n");
7429996Sminshall 		empty--;
7529996Sminshall 	    }
7629996Sminshall 	}
7729996Sminshall 	printf("\t{ %d, {\t/* 0x%02x */\n\t", ph->keynumber, scancode);
7829996Sminshall 	for (i = 0; i < 4; i++) {
7929996Sminshall 	    printf("\t{ ");
8030077Sminshall 	    switch (ph->hit[i].ctlrfcn) {
8129996Sminshall 	    case undefined:
8230077Sminshall 		printf("undefined");
8329996Sminshall 		break;
8430077Sminshall 	    case FCN_CHARACTER:
8530077Sminshall 		printf("FCN_CHARACTER, 0x%02x", ph->hit[i].code);
8629996Sminshall 		break;
8730077Sminshall 	    case FCN_AID:
8830077Sminshall 		printf("FCN_AID, %s", Ph->name[i]);
8929996Sminshall 		break;
9030077Sminshall 	    case FCN_NULL:
9130077Sminshall 	    default:
9230077Sminshall 		if ((Ph->name[i] != 0)
9330077Sminshall 				    && (strcmp(Ph->name[i], "FCN_NULL") != 0)) {
9430077Sminshall 		    printf("%s", Ph->name[i]);
9530077Sminshall 		} else {
9630077Sminshall 		    printf("undefined");
9730077Sminshall 		}
9829996Sminshall 		break;
9929996Sminshall 	    }
10029996Sminshall 	    printf(" },\n\t");
10129996Sminshall 	}
10229996Sminshall 	printf("} },\n");
10329996Sminshall     }
10429996Sminshall     printf("};\n");
105*31102Sminshall     return 0;
10629996Sminshall }
107