129998Sminshall 
229998Sminshall #include <stdio.h>
331102Sminshall #if	defined(unix)
431065Sminshall #include <strings.h>
531102Sminshall #else	/* defined(unix) */
631102Sminshall #include <string.h>
731102Sminshall #endif	/* defined(unix) */
829998Sminshall #include <ctype.h>
929998Sminshall 
1031175Sminshall #include "../general/general.h"
1130052Sminshall #include "../ascii/ascebc.h"
1230052Sminshall #include "../ctlr/ebc_disp.h"
1330052Sminshall #include "../ctlr/function.h"
1429998Sminshall 
1529998Sminshall #include "dohits.h"
1629998Sminshall 
1731102Sminshall static struct tbl {
1831246Sminshall     unsigned char
1931246Sminshall 	scancode,
2031246Sminshall 	used;
2131246Sminshall     char
2231246Sminshall 	*shiftstate;
2331102Sminshall } tbl[128];
2429998Sminshall 
2531102Sminshall int
2630077Sminshall main(argc, argv)
2730077Sminshall int	argc;
2830077Sminshall char	*argv[];
2929998Sminshall {
3029998Sminshall     int scancode;
3130052Sminshall     int asciicode;
3229998Sminshall     int empty;
3329998Sminshall     int i;
3430052Sminshall     int c;
3529998Sminshall     int found;
3629998Sminshall     struct hits *ph;
3729998Sminshall     struct Hits *Ph;
3829998Sminshall     struct thing *this;
3931246Sminshall     struct thing **attable;
4031102Sminshall     struct tbl *Pt;
4131246Sminshall     static char *shiftof[] =
4231246Sminshall 	    { "0", "SHIFT_UPSHIFT", "SHIFT_ALT", "SHIFT_ALT|SHIFT_UPSHIFT" };
4330077Sminshall     char *aidfile = 0, *fcnfile = 0;
4429998Sminshall 
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     }
5529998Sminshall 
5630077Sminshall     dohits(aidfile, fcnfile);		/* Set up "Hits" */
5730077Sminshall 
5830052Sminshall     printf("/*\n");
5930052Sminshall     printf(" * Ascii to scancode conversion table.  First\n");
6030052Sminshall     printf(" * 128 bytes (0-127) correspond with actual Ascii\n");
6131246Sminshall     printf(" * characters; the rest are functions from ctrl/function.h\n");
6230052Sminshall     printf(" */\n");
6330052Sminshall     /* Build the ascii part of the table. */
6430052Sminshall     for (Ph = Hits, scancode = 0; Ph <= Hits+highestof(Hits);
6530052Sminshall 							Ph++, scancode++) {
6630052Sminshall 	ph = &Ph->hits;
6730052Sminshall 	for (i = 0; i < 4; i++) {
6830077Sminshall 	    if (ph->hit[i].ctlrfcn == FCN_CHARACTER) {
6930052Sminshall 		c = Ph->name[i][0];	/* "name" of this one */
7031246Sminshall 		if (tbl[c].used == 0) {
7131246Sminshall 		    tbl[c].used = 1;
7231246Sminshall 		    tbl[c].shiftstate = shiftof[i];
7330052Sminshall 		    tbl[c].scancode = scancode;
7430052Sminshall 		}
7530052Sminshall 	    }
7630052Sminshall 	}
7730052Sminshall     }
7830052Sminshall     /* Now, output the table */
7930052Sminshall     for (Pt = tbl, asciicode = 0; Pt <= tbl+highestof(tbl); Pt++, asciicode++) {
8031246Sminshall 	if (Pt->used == 0) {
8130052Sminshall 	    if (isprint(asciicode) && (asciicode != ' ')) {
8230052Sminshall 		fprintf(stderr, "Unable to produce scancode sequence for");
8330052Sminshall 		fprintf(stderr, " ASCII character [%c]!\n", asciicode);
8430052Sminshall 	    }
8531246Sminshall 	    printf("\t{ 0, 0, undefined, 0 },\t");
8630052Sminshall 	} else {
8731246Sminshall 	    printf("\t{ 0x%02x, %s, FCN_CHARACTER, 0 },",
8831246Sminshall 					Pt->scancode, Pt->shiftstate);
8930052Sminshall 	}
9030052Sminshall 	printf("\t/* 0x%x", asciicode);
9130052Sminshall 	if (isprint(asciicode)) {
9230052Sminshall 	    printf(" [%c]", asciicode);
9330052Sminshall 	}
9430052Sminshall 	printf(" */\n");
9530052Sminshall     }
9630052Sminshall 
9730052Sminshall 
9831246Sminshall     for (attable = &table[0]; attable <= &table[highestof(table)]; attable++) {
9931246Sminshall 	for (this = *attable; this; this = this->next) {
10031246Sminshall 	    Ph = this->hits;
10131246Sminshall 	    if (Ph == 0) {
10231246Sminshall 		continue;
10331246Sminshall 	    }
10431246Sminshall 	    for (i = 0; i < 4; i++) {
10531246Sminshall 		if ((Ph->name[i] != 0) &&
10631246Sminshall 			(Ph->name[i][0] == this->name[0]) &&
10731246Sminshall 			(strcmp(Ph->name[i], this->name) == 0)) {
10831246Sminshall 		    printf("\t{ 0x%02x, %s, ",
10931246Sminshall 				Ph-Hits, shiftof[i]);
110*31247Sminshall 		    if (memcmp("AID_", this->name, 4) == 0) {	/* AID key */
11131246Sminshall 			printf("FCN_AID, ");
11231246Sminshall 		    } else {
11331246Sminshall 			printf("%s, ", Ph->name[i]);
11429998Sminshall 		    }
115*31247Sminshall 		    if (memcmp("PF", this->name+4, 2) == 0) {
11631246Sminshall 			printf("\"PFK%s\" },\n", Ph->name[i]+4+2);
11731246Sminshall 		    } else {
11831246Sminshall 			printf("\"%s\" },\n", Ph->name[i]+4);
11931246Sminshall 		    }
12029998Sminshall 		}
12129998Sminshall 	    }
12229998Sminshall 	}
12329998Sminshall     }
12431102Sminshall 
12531102Sminshall     return 0;
12629998Sminshall }
127