129998Sminshall /*
229998Sminshall  * This program scans a file which describes a keyboard.  The output
329998Sminshall  * of the program is a series of 'C' declarations which describe a
429998Sminshall  * mapping between (scancode, shiftstate, altstate) and 3270 functions,
529998Sminshall  * characters, and AIDs.
629998Sminshall  *
729998Sminshall  * The format of the input file is as follows:
829998Sminshall  *
929998Sminshall  * keynumber [ scancode [ unshifted [ shifted [ alted [ shiftalted ] ] ] ] ]
1029998Sminshall  *
1129998Sminshall  * keynumber is in decimal, and starts in column 1.
1229998Sminshall  * scancode is hexadecimal.
1329998Sminshall  * unshifted, etc. - these are either a single ascii character,
1429998Sminshall  *			or the name of a function or an AID-generating key.
1529998Sminshall  *
1629998Sminshall  * all fields are separated by a single space.
1729998Sminshall  */
1829998Sminshall 
1929998Sminshall #include <stdio.h>
20*31065Sminshall #include <strings.h>
2129998Sminshall #include <ctype.h>
2229998Sminshall 
2329998Sminshall #define	LETS_SEE_ASCII
2430052Sminshall #include "../keyboard/m4.out"
2529998Sminshall #undef	LETS_SEE_ASCII
2629998Sminshall 
2730052Sminshall #include "../ascii/ascebc.h"
2830052Sminshall #include "../ctlr/ebc_disp.h"
2930052Sminshall #include "../ctlr/function.h"
3029998Sminshall 
3129998Sminshall #include "dohits.h"
3229998Sminshall 
3329998Sminshall 
3429998Sminshall void
3530077Sminshall main(argc, argv)
3630077Sminshall int	argc;
3730077Sminshall char	*argv[];
3829998Sminshall {
3929998Sminshall     int scancode;
4030052Sminshall     int asciicode;
4129998Sminshall     int empty;
4229998Sminshall     int i;
4330052Sminshall     int c;
4429998Sminshall     int found;
4529998Sminshall     struct hits *ph;
4629998Sminshall     struct Hits *Ph;
4729998Sminshall     TC_Ascii_t *TC;
4829998Sminshall     struct thing *this;
4930052Sminshall     struct {
5030052Sminshall 	char *shift;
5130052Sminshall 	int	scancode;
5230052Sminshall     } tbl[128], *Pt;
5330052Sminshall     static char *shiftof[] = { "normal", "shifted", "alted", "shiftalted" };
5430077Sminshall     char *aidfile = 0, *fcnfile = 0;
5529998Sminshall 
5630077Sminshall     if (argc > 1) {
5730077Sminshall 	if (argv[1][0] != '-') {
5830077Sminshall 	    aidfile = argv[1];
5930077Sminshall 	}
6030077Sminshall     }
6130077Sminshall     if (argc > 2) {
6230077Sminshall 	if (argv[2][0] != '-') {
6330077Sminshall 	    fcnfile = argv[2];
6430077Sminshall 	}
6530077Sminshall     }
6629998Sminshall 
6730077Sminshall     dohits(aidfile, fcnfile);		/* Set up "Hits" */
6830077Sminshall 
6930052Sminshall     printf("/*\n");
7030052Sminshall     printf(" * Ascii to scancode conversion table.  First\n");
7130052Sminshall     printf(" * 128 bytes (0-127) correspond with actual Ascii\n");
7230052Sminshall     printf(" * characters; the rest are TC types from termcodes.m4\n");
7330052Sminshall     printf(" * (actually, from m4.out).\n");
7430052Sminshall     printf(" */\n");
7530052Sminshall     printf("struct asctosc {\n");
7630052Sminshall     printf("\tenum shiftvalue { cantdo, normal, shifted, alted,");
7729998Sminshall     printf(" shiftalted } shift;\n\tunsigned char scancode;");
7830052Sminshall     printf("\n} asctosc[] = {\n");
7930052Sminshall     /* Build the ascii part of the table. */
8030052Sminshall     for (Ph = Hits, scancode = 0; Ph <= Hits+highestof(Hits);
8130052Sminshall 							Ph++, scancode++) {
8230052Sminshall 	ph = &Ph->hits;
8330052Sminshall 	for (i = 0; i < 4; i++) {
8430077Sminshall 	    if (ph->hit[i].ctlrfcn == FCN_CHARACTER) {
8530052Sminshall 		c = Ph->name[i][0];	/* "name" of this one */
86*31065Sminshall 		if ((tbl[c].shift == 0) || (tbl[c].shift[0] == 0)) {
8730052Sminshall 		    tbl[c].shift = shiftof[i];
8830052Sminshall 		    tbl[c].scancode = scancode;
8930052Sminshall 		}
9030052Sminshall 	    }
9130052Sminshall 	}
9230052Sminshall     }
9330052Sminshall     /* Now, output the table */
9430052Sminshall     for (Pt = tbl, asciicode = 0; Pt <= tbl+highestof(tbl); Pt++, asciicode++) {
9530052Sminshall 	if (Pt->shift[0] == 0) {
9630052Sminshall 	    if (isprint(asciicode) && (asciicode != ' ')) {
9730052Sminshall 		fprintf(stderr, "Unable to produce scancode sequence for");
9830052Sminshall 		fprintf(stderr, " ASCII character [%c]!\n", asciicode);
9930052Sminshall 	    }
10030052Sminshall 	    printf("\t{ cantdo, 0 },\t");
10130052Sminshall 	} else {
10230052Sminshall 	    printf("\t{ %s, 0x%x },", Pt->shift, Pt->scancode);
10330052Sminshall 	}
10430052Sminshall 	printf("\t/* 0x%x", asciicode);
10530052Sminshall 	if (isprint(asciicode)) {
10630052Sminshall 	    printf(" [%c]", asciicode);
10730052Sminshall 	}
10830052Sminshall 	printf(" */\n");
10930052Sminshall     }
11030052Sminshall 
11130052Sminshall 
11230052Sminshall     for (TC = &TC_Ascii[TC_LOWEST-TC_LOWEST];
11330052Sminshall 		TC < &TC_Ascii[TC_LOWEST_USER-TC_LOWEST]; TC++, asciicode++) {
11430052Sminshall 	printf("\t{ cantdo, 0 },\t");
11530052Sminshall 	printf("\t/* 0x%x */\n", asciicode);
11630052Sminshall     }
11729998Sminshall     for (TC = &TC_Ascii[TC_LOWEST_USER-TC_LOWEST];
11830052Sminshall 		TC <= &TC_Ascii[TC_HIGHEST-TC_LOWEST]; TC++, asciicode++) {
11929998Sminshall 	/* Hack for "PFK" names (which should be "PF") */
12029998Sminshall 	if (memcmp(TC->tc_name, "PFK", 3) == 0) {
12129998Sminshall 	    static char PFonly[100] = "PF";
12229998Sminshall 
12329998Sminshall 	    strcpy(PFonly+2, TC->tc_name+3);
12429998Sminshall 	    TC->tc_name = PFonly;
12529998Sminshall 	}
12629998Sminshall 	found = 0;
12729998Sminshall 	for (this = firstentry(TC->tc_name); (!found) && this;
12829998Sminshall 							this = this->next) {
12929998Sminshall 	    if ((this->name[4] == TC->tc_name[0])
13029998Sminshall 			&& (strcmp(this->name+4, TC->tc_name) == 0)) {
13129998Sminshall 		/* this is the entry */
13229998Sminshall 		/* What we have is a TC entry matching a scancode entry */
13329998Sminshall 		Ph = this->hits;		/* now, get hits */
13429998Sminshall 		if (Ph == 0) {
13529998Sminshall 		    continue;
13629998Sminshall 		}
13729998Sminshall 		for (i = 0; i < 4; i++) {
13829998Sminshall 		    if ((Ph->name[i][4] == TC->tc_name[0])
13929998Sminshall 			    && (strcmp(Ph->name[i]+4, TC->tc_name) == 0)) {
14029998Sminshall 			/* This is THE hit! */
14129998Sminshall 			found = 1;
14229998Sminshall 			printf("\t{ ");
14329998Sminshall 			switch (i) {
14429998Sminshall 			case 0:
14529998Sminshall 			    printf("normal, ");
14629998Sminshall 			    break;
14729998Sminshall 			case 1:
14829998Sminshall 			    printf("shifted, ");
14929998Sminshall 			    break;
15029998Sminshall 			case 2:
15129998Sminshall 			    printf("alted, ");
15229998Sminshall 			    break;
15329998Sminshall 			case 3:
15429998Sminshall 			    printf("shitfalted, ");
15529998Sminshall 			    break;
15629998Sminshall 			}
15730052Sminshall 			printf("0x%02x },", Ph-Hits);
15830052Sminshall 			break;
15929998Sminshall 		    }
16029998Sminshall 		}
16129998Sminshall 	    }
16229998Sminshall 	}
16329998Sminshall 	if (!found) {
16430052Sminshall 	    printf("\t{ cantdo, 0 },\t");
16529998Sminshall 	    fprintf(stderr, "Unable to produce TC_%s with scan codes!\n",
16629998Sminshall 				TC->tc_name);
16729998Sminshall 	}
16830052Sminshall 	printf("\t/* 0x%x - %s */\n", asciicode, TC->tc_name);
16929998Sminshall     }
17029998Sminshall     printf("};\n");
17129998Sminshall }
172