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*31065Sminshall #include <strings.h> 2129996Sminshall #include <ctype.h> 2230052Sminshall #include "../ascii/ascebc.h" 2330052Sminshall #include "../ctlr/ebc_disp.h" 2430052Sminshall #include "../ctlr/function.h" 2529996Sminshall 2629996Sminshall #include "dohits.h" 2729996Sminshall 2829996Sminshall 2929996Sminshall void 3030077Sminshall main(argc, argv) 3130077Sminshall int argc; 3230077Sminshall char *argv[]; 3329996Sminshall { 3429996Sminshall int scancode; 3529996Sminshall int empty; 3629996Sminshall int i; 3729996Sminshall struct hits *ph; 3829996Sminshall struct Hits *Ph; 3930077Sminshall char *aidfile = 0, *fcnfile = 0; 4029996Sminshall 4130077Sminshall if (argc > 1) { 4230077Sminshall if (argv[1][0] != '-') { 4330077Sminshall aidfile = argv[1]; 4430077Sminshall } 4530077Sminshall } 4630077Sminshall if (argc > 2) { 4730077Sminshall if (argv[2][0] != '-') { 4830077Sminshall fcnfile = argv[2]; 4930077Sminshall } 5030077Sminshall } 5129996Sminshall 5230077Sminshall dohits(aidfile, fcnfile); /* Set up "Hits" */ 5330077Sminshall 5429996Sminshall printf("struct hits hits[] = {\n"); 5529996Sminshall empty = 0; 5629996Sminshall scancode = -1; 5729996Sminshall for (Ph = Hits; Ph < Hits+(sizeof Hits/sizeof Hits[0]); Ph++) { 5829996Sminshall ph = &Ph->hits; 5929996Sminshall scancode++; 6030077Sminshall if ((ph->hit[0].ctlrfcn == undefined) 6130077Sminshall && (ph->hit[1].ctlrfcn == undefined) 6230077Sminshall && (ph->hit[2].ctlrfcn == undefined) 6330077Sminshall && (ph->hit[3].ctlrfcn == undefined)) { 6429996Sminshall empty++; 6529996Sminshall continue; 6629996Sminshall } else { 6729996Sminshall while (empty) { 6830077Sminshall printf("\t{ 0, { {undefined}, {undefined}"); 6930077Sminshall printf(", {undefined}, {undefined} } },\n"); 7029996Sminshall empty--; 7129996Sminshall } 7229996Sminshall } 7329996Sminshall printf("\t{ %d, {\t/* 0x%02x */\n\t", ph->keynumber, scancode); 7429996Sminshall for (i = 0; i < 4; i++) { 7529996Sminshall printf("\t{ "); 7630077Sminshall switch (ph->hit[i].ctlrfcn) { 7729996Sminshall case undefined: 7830077Sminshall printf("undefined"); 7929996Sminshall break; 8030077Sminshall case FCN_CHARACTER: 8130077Sminshall printf("FCN_CHARACTER, 0x%02x", ph->hit[i].code); 8229996Sminshall break; 8330077Sminshall case FCN_AID: 8430077Sminshall printf("FCN_AID, %s", Ph->name[i]); 8529996Sminshall break; 8630077Sminshall case FCN_NULL: 8730077Sminshall default: 8830077Sminshall if ((Ph->name[i] != 0) 8930077Sminshall && (strcmp(Ph->name[i], "FCN_NULL") != 0)) { 9030077Sminshall printf("%s", Ph->name[i]); 9130077Sminshall } else { 9230077Sminshall printf("undefined"); 9330077Sminshall } 9429996Sminshall break; 9529996Sminshall } 9629996Sminshall printf(" },\n\t"); 9729996Sminshall } 9829996Sminshall printf("} },\n"); 9929996Sminshall } 10029996Sminshall printf("};\n"); 10129996Sminshall } 102