1*29995Sminshall /* 2*29995Sminshall * This program scans a file which describes a keyboard. The output 3*29995Sminshall * of the program is a series of 'C' declarations which describe a 4*29995Sminshall * mapping between (scancode, shiftstate, altstate) and 3270 functions, 5*29995Sminshall * characters, and AIDs. 6*29995Sminshall * 7*29995Sminshall * The format of the input file is as follows: 8*29995Sminshall * 9*29995Sminshall * keynumber [ scancode [ unshifted [ shifted [ alted [ shiftalted ] ] ] ] ] 10*29995Sminshall * 11*29995Sminshall * keynumber is in decimal, and starts in column 1. 12*29995Sminshall * scancode is hexadecimal. 13*29995Sminshall * unshifted, etc. - these are either a single ascii character, 14*29995Sminshall * or the name of a function or an AID-generating key. 15*29995Sminshall * 16*29995Sminshall * all fields are separated by a single space. 17*29995Sminshall */ 18*29995Sminshall 19*29995Sminshall #include <stdio.h> 20*29995Sminshall #include <string.h> 21*29995Sminshall #include <ctype.h> 22*29995Sminshall #include "../ascebc.h" 23*29995Sminshall #include "../ebc_disp.h" 24*29995Sminshall #include "../kbd3270.h" 25*29995Sminshall 26*29995Sminshall #include "dohits.h" 27*29995Sminshall 28*29995Sminshall struct Hits Hits[256]; /* one for each of 0x00-0xff */ 29*29995Sminshall 30*29995Sminshall struct thing *table[100]; 31*29995Sminshall 32*29995Sminshall unsigned int 33*29995Sminshall dohash(seed, string) 34*29995Sminshall unsigned int seed; 35*29995Sminshall char *string; 36*29995Sminshall { 37*29995Sminshall register unsigned int i = seed; 38*29995Sminshall register unsigned char c; 39*29995Sminshall 40*29995Sminshall while (c = *string++) { 41*29995Sminshall if (c >= 0x60) { 42*29995Sminshall c - = (0x60+0x20); 43*29995Sminshall } else { 44*29995Sminshall c -= 0x20; 45*29995Sminshall } 46*29995Sminshall i = (i>>26) + (i<<6) + (c&0x3f); 47*29995Sminshall } 48*29995Sminshall return i; 49*29995Sminshall } 50*29995Sminshall 51*29995Sminshall void 52*29995Sminshall add(first, second, value) 53*29995Sminshall { 54*29995Sminshall struct thing **item, *this; 55*29995Sminshall 56*29995Sminshall item = &firstentry(second); 57*29995Sminshall this = (struct thing *) malloc(sizeof *this); 58*29995Sminshall this->next = *item; 59*29995Sminshall *item = this; 60*29995Sminshall this->value = value; 61*29995Sminshall strcpy(this->name, first); 62*29995Sminshall strcpy(this->name+strlen(this->name), second); 63*29995Sminshall } 64*29995Sminshall 65*29995Sminshall void 66*29995Sminshall scan(file, prefix) 67*29995Sminshall char *file, /* Name of file to scan */ 68*29995Sminshall *prefix; /* prefix of what should be picked up */ 69*29995Sminshall { 70*29995Sminshall FILE *ourfile; 71*29995Sminshall char compare[100]; 72*29995Sminshall char what[100], value[100]; 73*29995Sminshall char line[200]; 74*29995Sminshall int whatitis; 75*29995Sminshall 76*29995Sminshall sprintf(compare, "#define %s%%s %%s", prefix); 77*29995Sminshall if ((ourfile = fopen(file, "r")) == NULL) { 78*29995Sminshall perror("fopen"); 79*29995Sminshall exit(1); 80*29995Sminshall } 81*29995Sminshall while (!feof(ourfile)) { 82*29995Sminshall if (fscanf(ourfile, compare, what, value) == 2) { 83*29995Sminshall if (value[0] == '0') { 84*29995Sminshall if ((value[1] == 'x') || (value[1] == 'X')) { 85*29995Sminshall sscanf(value, "0x%x", &whatitis); 86*29995Sminshall } else { 87*29995Sminshall sscanf(value, "0%o", &whatitis); 88*29995Sminshall } 89*29995Sminshall } else { 90*29995Sminshall sscanf(value, "%d", &whatitis); 91*29995Sminshall } 92*29995Sminshall add(prefix, what, whatitis); 93*29995Sminshall } 94*29995Sminshall do { 95*29995Sminshall if (fgets(line, sizeof line, ourfile) == NULL) { 96*29995Sminshall if (!feof(ourfile)) { 97*29995Sminshall perror("fgets"); 98*29995Sminshall } 99*29995Sminshall break; 100*29995Sminshall } 101*29995Sminshall } while (line[strlen(line)-1] != '\n'); 102*29995Sminshall } 103*29995Sminshall } 104*29995Sminshall 105*29995Sminshall 106*29995Sminshall char * 107*29995Sminshall doit(hit, type, hits) 108*29995Sminshall struct hit *hit; 109*29995Sminshall unsigned char *type; 110*29995Sminshall struct Hits *hits; 111*29995Sminshall { 112*29995Sminshall struct thing *this; 113*29995Sminshall 114*29995Sminshall hit->type = illegal; 115*29995Sminshall if (type[0] == 0) { 116*29995Sminshall return 0; 117*29995Sminshall } 118*29995Sminshall if (type[1] == 0) { /* character */ 119*29995Sminshall hit->type = character; 120*29995Sminshall hit->code = ebc_disp[ascebc[AE_IN][type[0]]]; 121*29995Sminshall } else { 122*29995Sminshall for (this = firstentry(type); this; this = this->next) { 123*29995Sminshall if ((type[0] == this->name[4]) 124*29995Sminshall && (strcmp(type, this->name+4) == 0)) { 125*29995Sminshall this->hits = hits; 126*29995Sminshall if (this->name[0] == 'F') { 127*29995Sminshall hit->type = function; 128*29995Sminshall } else { 129*29995Sminshall hit->type = aid; 130*29995Sminshall } 131*29995Sminshall return this->name; 132*29995Sminshall } 133*29995Sminshall } 134*29995Sminshall printf("Error: Unknown type %s.\n", type); 135*29995Sminshall return 0; 136*29995Sminshall } 137*29995Sminshall } 138*29995Sminshall 139*29995Sminshall 140*29995Sminshall void 141*29995Sminshall dohits() 142*29995Sminshall { 143*29995Sminshall unsigned char plain[100], shifted[100], alted[100], shiftalted[100]; 144*29995Sminshall unsigned char line[200]; 145*29995Sminshall int keynumber, scancode; 146*29995Sminshall int empty; 147*29995Sminshall int i; 148*29995Sminshall struct hit *hit; 149*29995Sminshall struct hits *ph; 150*29995Sminshall struct Hits *Ph; 151*29995Sminshall 152*29995Sminshall memset((char *)Hits, 0, sizeof Hits); 153*29995Sminshall 154*29995Sminshall /* 155*29995Sminshall * First, we read "host3270.h" to find the names/values of 156*29995Sminshall * various AID; then we read kbd3270.h to find the names/values 157*29995Sminshall * of various FCNs. 158*29995Sminshall */ 159*29995Sminshall 160*29995Sminshall scan("host3270.h", "AID_"); 161*29995Sminshall scan("kbd3270.h", "FCN_"); 162*29995Sminshall 163*29995Sminshall while (gets(line) != NULL) { 164*29995Sminshall if (!isdigit(line[0])) { 165*29995Sminshall continue; 166*29995Sminshall } 167*29995Sminshall plain[0] = shifted[0] = alted[0] = shiftalted[0] = 0; 168*29995Sminshall keynumber = -1; 169*29995Sminshall scancode = -1; 170*29995Sminshall (void) sscanf(line, "%d %x %s %s %s %s", &keynumber, 171*29995Sminshall &scancode, plain, shifted, alted, shiftalted); 172*29995Sminshall if ((keynumber == -1) || (scancode == -1) 173*29995Sminshall || ((plain[0] == 0) 174*29995Sminshall && (shifted[0] == 0) 175*29995Sminshall && (alted[0] == 0) 176*29995Sminshall && (shiftalted[0] == 0))) { 177*29995Sminshall continue; 178*29995Sminshall } 179*29995Sminshall if (scancode >= 256) { 180*29995Sminshall printf("Error: scancode 0x%02x for keynumber %d\n", scancode, 181*29995Sminshall keynumber); 182*29995Sminshall break; 183*29995Sminshall } 184*29995Sminshall if (Hits[scancode].hits.hit[0].type != undefined) { 185*29995Sminshall printf("Error: duplicate scancode 0x%02x for keynumber %d\n", 186*29995Sminshall scancode, keynumber); 187*29995Sminshall break; 188*29995Sminshall } 189*29995Sminshall hit = Hits[scancode].hits.hit; 190*29995Sminshall Hits[scancode].hits.keynumber = keynumber; 191*29995Sminshall Hits[scancode].name[0] = doit(hit, plain, &Hits[scancode]); 192*29995Sminshall Hits[scancode].name[1] = doit(hit+1, shifted, &Hits[scancode]); 193*29995Sminshall Hits[scancode].name[2] = doit(hit+2, alted, &Hits[scancode]); 194*29995Sminshall Hits[scancode].name[3] = doit(hit+3, shiftalted, &Hits[scancode]); 195*29995Sminshall } 196*29995Sminshall } 197