129995Sminshall /* 229995Sminshall * This program scans a file which describes a keyboard. The output 329995Sminshall * of the program is a series of 'C' declarations which describe a 429995Sminshall * mapping between (scancode, shiftstate, altstate) and 3270 functions, 529995Sminshall * characters, and AIDs. 629995Sminshall * 729995Sminshall * The format of the input file is as follows: 829995Sminshall * 929995Sminshall * keynumber [ scancode [ unshifted [ shifted [ alted [ shiftalted ] ] ] ] ] 1029995Sminshall * 1129995Sminshall * keynumber is in decimal, and starts in column 1. 1229995Sminshall * scancode is hexadecimal. 1329995Sminshall * unshifted, etc. - these are either a single ascii character, 1429995Sminshall * or the name of a function or an AID-generating key. 1529995Sminshall * 1629995Sminshall * all fields are separated by a single space. 1729995Sminshall */ 1829995Sminshall 1929995Sminshall #include <stdio.h> 2029995Sminshall #include <string.h> 2129995Sminshall #include <ctype.h> 22*30052Sminshall #include "../ascii/ascebc.h" 23*30052Sminshall #include "../ctlr/ebc_disp.h" 24*30052Sminshall #include "../ctlr/function.h" 2529995Sminshall 2629995Sminshall #include "dohits.h" 2729995Sminshall 2829995Sminshall struct Hits Hits[256]; /* one for each of 0x00-0xff */ 2929995Sminshall 3029995Sminshall struct thing *table[100]; 3129995Sminshall 32*30052Sminshall extern char *malloc(); 33*30052Sminshall 3429995Sminshall unsigned int 3529995Sminshall dohash(seed, string) 3629995Sminshall unsigned int seed; 3729995Sminshall char *string; 3829995Sminshall { 3929995Sminshall register unsigned int i = seed; 4029995Sminshall register unsigned char c; 4129995Sminshall 4229995Sminshall while (c = *string++) { 4329995Sminshall if (c >= 0x60) { 4429995Sminshall c - = (0x60+0x20); 4529995Sminshall } else { 4629995Sminshall c -= 0x20; 4729995Sminshall } 4829995Sminshall i = (i>>26) + (i<<6) + (c&0x3f); 4929995Sminshall } 5029995Sminshall return i; 5129995Sminshall } 5229995Sminshall 5329995Sminshall void 5429995Sminshall add(first, second, value) 5529995Sminshall { 5629995Sminshall struct thing **item, *this; 5729995Sminshall 5829995Sminshall item = &firstentry(second); 5929995Sminshall this = (struct thing *) malloc(sizeof *this); 6029995Sminshall this->next = *item; 6129995Sminshall *item = this; 6229995Sminshall this->value = value; 6329995Sminshall strcpy(this->name, first); 6429995Sminshall strcpy(this->name+strlen(this->name), second); 6529995Sminshall } 6629995Sminshall 6729995Sminshall void 6829995Sminshall scan(file, prefix) 6929995Sminshall char *file, /* Name of file to scan */ 7029995Sminshall *prefix; /* prefix of what should be picked up */ 7129995Sminshall { 7229995Sminshall FILE *ourfile; 7329995Sminshall char compare[100]; 7429995Sminshall char what[100], value[100]; 7529995Sminshall char line[200]; 7629995Sminshall int whatitis; 7729995Sminshall 7829995Sminshall sprintf(compare, "#define %s%%s %%s", prefix); 7929995Sminshall if ((ourfile = fopen(file, "r")) == NULL) { 8029995Sminshall perror("fopen"); 8129995Sminshall exit(1); 8229995Sminshall } 8329995Sminshall while (!feof(ourfile)) { 8429995Sminshall if (fscanf(ourfile, compare, what, value) == 2) { 8529995Sminshall if (value[0] == '0') { 8629995Sminshall if ((value[1] == 'x') || (value[1] == 'X')) { 8729995Sminshall sscanf(value, "0x%x", &whatitis); 8829995Sminshall } else { 8929995Sminshall sscanf(value, "0%o", &whatitis); 9029995Sminshall } 9129995Sminshall } else { 9229995Sminshall sscanf(value, "%d", &whatitis); 9329995Sminshall } 9429995Sminshall add(prefix, what, whatitis); 9529995Sminshall } 9629995Sminshall do { 9729995Sminshall if (fgets(line, sizeof line, ourfile) == NULL) { 9829995Sminshall if (!feof(ourfile)) { 9929995Sminshall perror("fgets"); 10029995Sminshall } 10129995Sminshall break; 10229995Sminshall } 10329995Sminshall } while (line[strlen(line)-1] != '\n'); 10429995Sminshall } 10529995Sminshall } 10629995Sminshall 107*30052Sminshall char *savechr(c) 108*30052Sminshall unsigned char c; 109*30052Sminshall { 110*30052Sminshall char *foo; 11129995Sminshall 112*30052Sminshall foo = malloc(sizeof c); 113*30052Sminshall if (foo == 0) { 114*30052Sminshall fprintf(stderr, "No room for ascii characters!\n"); 115*30052Sminshall exit(1); 116*30052Sminshall } 117*30052Sminshall *foo = c; 118*30052Sminshall return foo; 119*30052Sminshall } 120*30052Sminshall 12129995Sminshall char * 12229995Sminshall doit(hit, type, hits) 12329995Sminshall struct hit *hit; 12429995Sminshall unsigned char *type; 12529995Sminshall struct Hits *hits; 12629995Sminshall { 12729995Sminshall struct thing *this; 12829995Sminshall 12929995Sminshall hit->type = illegal; 13029995Sminshall if (type[0] == 0) { 13129995Sminshall return 0; 13229995Sminshall } 13329995Sminshall if (type[1] == 0) { /* character */ 13429995Sminshall hit->type = character; 13529995Sminshall hit->code = ebc_disp[ascebc[AE_IN][type[0]]]; 136*30052Sminshall return savechr(*type); /* The character is the name */ 13729995Sminshall } else { 13829995Sminshall for (this = firstentry(type); this; this = this->next) { 13929995Sminshall if ((type[0] == this->name[4]) 14029995Sminshall && (strcmp(type, this->name+4) == 0)) { 14129995Sminshall this->hits = hits; 14229995Sminshall if (this->name[0] == 'F') { 14329995Sminshall hit->type = function; 14429995Sminshall } else { 14529995Sminshall hit->type = aid; 14629995Sminshall } 14729995Sminshall return this->name; 14829995Sminshall } 14929995Sminshall } 150*30052Sminshall fprintf(stderr, "Error: Unknown type %s.\n", type); 15129995Sminshall return 0; 15229995Sminshall } 15329995Sminshall } 15429995Sminshall 15529995Sminshall 15629995Sminshall void 15729995Sminshall dohits() 15829995Sminshall { 15929995Sminshall unsigned char plain[100], shifted[100], alted[100], shiftalted[100]; 16029995Sminshall unsigned char line[200]; 16129995Sminshall int keynumber, scancode; 16229995Sminshall int empty; 16329995Sminshall int i; 16429995Sminshall struct hit *hit; 16529995Sminshall struct hits *ph; 16629995Sminshall struct Hits *Ph; 16729995Sminshall 16829995Sminshall memset((char *)Hits, 0, sizeof Hits); 16929995Sminshall 17029995Sminshall /* 17129995Sminshall * First, we read "host3270.h" to find the names/values of 17229995Sminshall * various AID; then we read kbd3270.h to find the names/values 17329995Sminshall * of various FCNs. 17429995Sminshall */ 17529995Sminshall 176*30052Sminshall scan("../ctlr/hostctlr.h", "AID_"); 177*30052Sminshall scan("../ctlr/function.h", "FCN_"); 17829995Sminshall 17929995Sminshall while (gets(line) != NULL) { 18029995Sminshall if (!isdigit(line[0])) { 18129995Sminshall continue; 18229995Sminshall } 18329995Sminshall plain[0] = shifted[0] = alted[0] = shiftalted[0] = 0; 18429995Sminshall keynumber = -1; 18529995Sminshall scancode = -1; 18629995Sminshall (void) sscanf(line, "%d %x %s %s %s %s", &keynumber, 18729995Sminshall &scancode, plain, shifted, alted, shiftalted); 18829995Sminshall if ((keynumber == -1) || (scancode == -1) 18929995Sminshall || ((plain[0] == 0) 19029995Sminshall && (shifted[0] == 0) 19129995Sminshall && (alted[0] == 0) 19229995Sminshall && (shiftalted[0] == 0))) { 19329995Sminshall continue; 19429995Sminshall } 19529995Sminshall if (scancode >= 256) { 196*30052Sminshall fprintf(stderr, 197*30052Sminshall "Error: scancode 0x%02x for keynumber %d\n", scancode, 19829995Sminshall keynumber); 19929995Sminshall break; 20029995Sminshall } 20129995Sminshall if (Hits[scancode].hits.hit[0].type != undefined) { 202*30052Sminshall fprintf(stderr, 203*30052Sminshall "Error: duplicate scancode 0x%02x for keynumber %d\n", 20429995Sminshall scancode, keynumber); 20529995Sminshall break; 20629995Sminshall } 20729995Sminshall hit = Hits[scancode].hits.hit; 20829995Sminshall Hits[scancode].hits.keynumber = keynumber; 20929995Sminshall Hits[scancode].name[0] = doit(hit, plain, &Hits[scancode]); 21029995Sminshall Hits[scancode].name[1] = doit(hit+1, shifted, &Hits[scancode]); 21129995Sminshall Hits[scancode].name[2] = doit(hit+2, alted, &Hits[scancode]); 21229995Sminshall Hits[scancode].name[3] = doit(hit+3, shiftalted, &Hits[scancode]); 21329995Sminshall } 21429995Sminshall } 215