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>
2031102Sminshall #if	defined(unix)
2131065Sminshall #include <strings.h>
2231102Sminshall #else	/* defined(unix) */
2331102Sminshall #include <string.h>
2431102Sminshall #endif	/* defined(unix) */
2529998Sminshall #include <ctype.h>
2629998Sminshall 
27*31175Sminshall #include "../general/general.h"
2829998Sminshall #define	LETS_SEE_ASCII
29*31175Sminshall #include "../ascii/m4.out"
3029998Sminshall #undef	LETS_SEE_ASCII
3129998Sminshall 
3230052Sminshall #include "../ascii/ascebc.h"
3330052Sminshall #include "../ctlr/ebc_disp.h"
3430052Sminshall #include "../ctlr/function.h"
3529998Sminshall 
3629998Sminshall #include "dohits.h"
3729998Sminshall 
3831102Sminshall static struct tbl {
3931102Sminshall     char *shift;
4031102Sminshall     int	scancode;
4131102Sminshall } tbl[128];
4229998Sminshall 
4331102Sminshall int
4430077Sminshall main(argc, argv)
4530077Sminshall int	argc;
4630077Sminshall char	*argv[];
4729998Sminshall {
4829998Sminshall     int scancode;
4930052Sminshall     int asciicode;
5029998Sminshall     int empty;
5129998Sminshall     int i;
5230052Sminshall     int c;
5329998Sminshall     int found;
5429998Sminshall     struct hits *ph;
5529998Sminshall     struct Hits *Ph;
5629998Sminshall     TC_Ascii_t *TC;
5729998Sminshall     struct thing *this;
5831102Sminshall     struct tbl *Pt;
5930052Sminshall     static char *shiftof[] = { "normal", "shifted", "alted", "shiftalted" };
6030077Sminshall     char *aidfile = 0, *fcnfile = 0;
6129998Sminshall 
6230077Sminshall     if (argc > 1) {
6330077Sminshall 	if (argv[1][0] != '-') {
6430077Sminshall 	    aidfile = argv[1];
6530077Sminshall 	}
6630077Sminshall     }
6730077Sminshall     if (argc > 2) {
6830077Sminshall 	if (argv[2][0] != '-') {
6930077Sminshall 	    fcnfile = argv[2];
7030077Sminshall 	}
7130077Sminshall     }
7229998Sminshall 
7330077Sminshall     dohits(aidfile, fcnfile);		/* Set up "Hits" */
7430077Sminshall 
7530052Sminshall     printf("/*\n");
7630052Sminshall     printf(" * Ascii to scancode conversion table.  First\n");
7730052Sminshall     printf(" * 128 bytes (0-127) correspond with actual Ascii\n");
7830052Sminshall     printf(" * characters; the rest are TC types from termcodes.m4\n");
7930052Sminshall     printf(" * (actually, from m4.out).\n");
8030052Sminshall     printf(" */\n");
8130052Sminshall     printf("struct asctosc {\n");
8230052Sminshall     printf("\tenum shiftvalue { cantdo, normal, shifted, alted,");
8329998Sminshall     printf(" shiftalted } shift;\n\tunsigned char scancode;");
8430052Sminshall     printf("\n} asctosc[] = {\n");
8530052Sminshall     /* Build the ascii part of the table. */
8630052Sminshall     for (Ph = Hits, scancode = 0; Ph <= Hits+highestof(Hits);
8730052Sminshall 							Ph++, scancode++) {
8830052Sminshall 	ph = &Ph->hits;
8930052Sminshall 	for (i = 0; i < 4; i++) {
9030077Sminshall 	    if (ph->hit[i].ctlrfcn == FCN_CHARACTER) {
9130052Sminshall 		c = Ph->name[i][0];	/* "name" of this one */
9231065Sminshall 		if ((tbl[c].shift == 0) || (tbl[c].shift[0] == 0)) {
9330052Sminshall 		    tbl[c].shift = shiftof[i];
9430052Sminshall 		    tbl[c].scancode = scancode;
9530052Sminshall 		}
9630052Sminshall 	    }
9730052Sminshall 	}
9830052Sminshall     }
9930052Sminshall     /* Now, output the table */
10030052Sminshall     for (Pt = tbl, asciicode = 0; Pt <= tbl+highestof(tbl); Pt++, asciicode++) {
10130052Sminshall 	if (Pt->shift[0] == 0) {
10230052Sminshall 	    if (isprint(asciicode) && (asciicode != ' ')) {
10330052Sminshall 		fprintf(stderr, "Unable to produce scancode sequence for");
10430052Sminshall 		fprintf(stderr, " ASCII character [%c]!\n", asciicode);
10530052Sminshall 	    }
10630052Sminshall 	    printf("\t{ cantdo, 0 },\t");
10730052Sminshall 	} else {
10830052Sminshall 	    printf("\t{ %s, 0x%x },", Pt->shift, Pt->scancode);
10930052Sminshall 	}
11030052Sminshall 	printf("\t/* 0x%x", asciicode);
11130052Sminshall 	if (isprint(asciicode)) {
11230052Sminshall 	    printf(" [%c]", asciicode);
11330052Sminshall 	}
11430052Sminshall 	printf(" */\n");
11530052Sminshall     }
11630052Sminshall 
11730052Sminshall 
11830052Sminshall     for (TC = &TC_Ascii[TC_LOWEST-TC_LOWEST];
11930052Sminshall 		TC < &TC_Ascii[TC_LOWEST_USER-TC_LOWEST]; TC++, asciicode++) {
12030052Sminshall 	printf("\t{ cantdo, 0 },\t");
12130052Sminshall 	printf("\t/* 0x%x */\n", asciicode);
12230052Sminshall     }
12329998Sminshall     for (TC = &TC_Ascii[TC_LOWEST_USER-TC_LOWEST];
12430052Sminshall 		TC <= &TC_Ascii[TC_HIGHEST-TC_LOWEST]; TC++, asciicode++) {
12529998Sminshall 	/* Hack for "PFK" names (which should be "PF") */
12629998Sminshall 	if (memcmp(TC->tc_name, "PFK", 3) == 0) {
12729998Sminshall 	    static char PFonly[100] = "PF";
12829998Sminshall 
12929998Sminshall 	    strcpy(PFonly+2, TC->tc_name+3);
13029998Sminshall 	    TC->tc_name = PFonly;
13129998Sminshall 	}
13229998Sminshall 	found = 0;
13329998Sminshall 	for (this = firstentry(TC->tc_name); (!found) && this;
13429998Sminshall 							this = this->next) {
13529998Sminshall 	    if ((this->name[4] == TC->tc_name[0])
13629998Sminshall 			&& (strcmp(this->name+4, TC->tc_name) == 0)) {
13729998Sminshall 		/* this is the entry */
13829998Sminshall 		/* What we have is a TC entry matching a scancode entry */
13929998Sminshall 		Ph = this->hits;		/* now, get hits */
14029998Sminshall 		if (Ph == 0) {
14129998Sminshall 		    continue;
14229998Sminshall 		}
14329998Sminshall 		for (i = 0; i < 4; i++) {
14429998Sminshall 		    if ((Ph->name[i][4] == TC->tc_name[0])
14529998Sminshall 			    && (strcmp(Ph->name[i]+4, TC->tc_name) == 0)) {
14629998Sminshall 			/* This is THE hit! */
14729998Sminshall 			found = 1;
14829998Sminshall 			printf("\t{ ");
14929998Sminshall 			switch (i) {
15029998Sminshall 			case 0:
15129998Sminshall 			    printf("normal, ");
15229998Sminshall 			    break;
15329998Sminshall 			case 1:
15429998Sminshall 			    printf("shifted, ");
15529998Sminshall 			    break;
15629998Sminshall 			case 2:
15729998Sminshall 			    printf("alted, ");
15829998Sminshall 			    break;
15929998Sminshall 			case 3:
16029998Sminshall 			    printf("shitfalted, ");
16129998Sminshall 			    break;
16229998Sminshall 			}
16330052Sminshall 			printf("0x%02x },", Ph-Hits);
16430052Sminshall 			break;
16529998Sminshall 		    }
16629998Sminshall 		}
16729998Sminshall 	    }
16829998Sminshall 	}
16929998Sminshall 	if (!found) {
17030052Sminshall 	    printf("\t{ cantdo, 0 },\t");
17129998Sminshall 	    fprintf(stderr, "Unable to produce TC_%s with scan codes!\n",
17229998Sminshall 				TC->tc_name);
17329998Sminshall 	}
17430052Sminshall 	printf("\t/* 0x%x - %s */\n", asciicode, TC->tc_name);
17529998Sminshall     }
17629998Sminshall     printf("};\n");
17731102Sminshall 
17831102Sminshall     return 0;
17929998Sminshall }
180