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