1*29998Sminshall /* 2*29998Sminshall * This program scans a file which describes a keyboard. The output 3*29998Sminshall * of the program is a series of 'C' declarations which describe a 4*29998Sminshall * mapping between (scancode, shiftstate, altstate) and 3270 functions, 5*29998Sminshall * characters, and AIDs. 6*29998Sminshall * 7*29998Sminshall * The format of the input file is as follows: 8*29998Sminshall * 9*29998Sminshall * keynumber [ scancode [ unshifted [ shifted [ alted [ shiftalted ] ] ] ] ] 10*29998Sminshall * 11*29998Sminshall * keynumber is in decimal, and starts in column 1. 12*29998Sminshall * scancode is hexadecimal. 13*29998Sminshall * unshifted, etc. - these are either a single ascii character, 14*29998Sminshall * or the name of a function or an AID-generating key. 15*29998Sminshall * 16*29998Sminshall * all fields are separated by a single space. 17*29998Sminshall */ 18*29998Sminshall 19*29998Sminshall #include <stdio.h> 20*29998Sminshall #include <string.h> 21*29998Sminshall #include <ctype.h> 22*29998Sminshall 23*29998Sminshall #define LETS_SEE_ASCII 24*29998Sminshall #include "../m4.out" 25*29998Sminshall #undef LETS_SEE_ASCII 26*29998Sminshall 27*29998Sminshall #include "../ascebc.h" 28*29998Sminshall #include "../ebc_disp.h" 29*29998Sminshall #include "../kbd3270.h" 30*29998Sminshall 31*29998Sminshall #include "dohits.h" 32*29998Sminshall 33*29998Sminshall 34*29998Sminshall void 35*29998Sminshall main() 36*29998Sminshall { 37*29998Sminshall int scancode; 38*29998Sminshall int empty; 39*29998Sminshall int i; 40*29998Sminshall int found; 41*29998Sminshall struct hits *ph; 42*29998Sminshall struct Hits *Ph; 43*29998Sminshall TC_Ascii_t *TC; 44*29998Sminshall struct thing *this; 45*29998Sminshall 46*29998Sminshall dohits(); /* Set up "Hits" */ 47*29998Sminshall 48*29998Sminshall printf("struct tctokbd {\n\tenum { cantdo, normal, shifted, alted,"); 49*29998Sminshall printf(" shiftalted } shift;\n\tunsigned char scancode;"); 50*29998Sminshall printf("\n} tctokbd[] = {\n"); 51*29998Sminshall for (TC = &TC_Ascii[TC_LOWEST_USER-TC_LOWEST]; 52*29998Sminshall TC <= &TC_Ascii[TC_HIGHEST-TC_LOWEST]; TC++) { 53*29998Sminshall /* Hack for "PFK" names (which should be "PF") */ 54*29998Sminshall if (memcmp(TC->tc_name, "PFK", 3) == 0) { 55*29998Sminshall static char PFonly[100] = "PF"; 56*29998Sminshall 57*29998Sminshall strcpy(PFonly+2, TC->tc_name+3); 58*29998Sminshall TC->tc_name = PFonly; 59*29998Sminshall } 60*29998Sminshall found = 0; 61*29998Sminshall for (this = firstentry(TC->tc_name); (!found) && this; 62*29998Sminshall this = this->next) { 63*29998Sminshall if ((this->name[4] == TC->tc_name[0]) 64*29998Sminshall && (strcmp(this->name+4, TC->tc_name) == 0)) { 65*29998Sminshall /* this is the entry */ 66*29998Sminshall /* What we have is a TC entry matching a scancode entry */ 67*29998Sminshall Ph = this->hits; /* now, get hits */ 68*29998Sminshall if (Ph == 0) { 69*29998Sminshall continue; 70*29998Sminshall } 71*29998Sminshall for (i = 0; i < 4; i++) { 72*29998Sminshall if ((Ph->name[i][4] == TC->tc_name[0]) 73*29998Sminshall && (strcmp(Ph->name[i]+4, TC->tc_name) == 0)) { 74*29998Sminshall /* This is THE hit! */ 75*29998Sminshall found = 1; 76*29998Sminshall printf("\t{ "); 77*29998Sminshall switch (i) { 78*29998Sminshall case 0: 79*29998Sminshall printf("normal, "); 80*29998Sminshall break; 81*29998Sminshall case 1: 82*29998Sminshall printf("shifted, "); 83*29998Sminshall break; 84*29998Sminshall case 2: 85*29998Sminshall printf("alted, "); 86*29998Sminshall break; 87*29998Sminshall case 3: 88*29998Sminshall printf("shitfalted, "); 89*29998Sminshall break; 90*29998Sminshall } 91*29998Sminshall printf("0x%x },\n", Ph-Hits); 92*29998Sminshall } 93*29998Sminshall } 94*29998Sminshall } 95*29998Sminshall } 96*29998Sminshall if (!found) { 97*29998Sminshall printf("\t{ cantdo, 0 },\n"); 98*29998Sminshall fprintf(stderr, "Unable to produce TC_%s with scan codes!\n", 99*29998Sminshall TC->tc_name); 100*29998Sminshall } 101*29998Sminshall } 102*29998Sminshall printf("};\n"); 103*29998Sminshall } 104