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> 2031102Sminshall #if defined(unix) 2131065Sminshall #include <strings.h> 2231102Sminshall #else /* defined(unix) */ 2331102Sminshall #include <string.h> 2431102Sminshall #endif /* defined(unix) */ 2529995Sminshall #include <ctype.h> 2631175Sminshall #include "../general/general.h" 27*31875Sminshall #include "../api/asc_ebc.h" 28*31875Sminshall #include "../api/ebc_disp.h" 2930052Sminshall #include "../ctlr/function.h" 3029995Sminshall 3129995Sminshall #include "dohits.h" 3229995Sminshall 3329995Sminshall struct Hits Hits[256]; /* one for each of 0x00-0xff */ 3429995Sminshall 3529995Sminshall struct thing *table[100]; 3629995Sminshall 3730052Sminshall extern char *malloc(); 3830052Sminshall 3929995Sminshall unsigned int 4029995Sminshall dohash(seed, string) 4129995Sminshall unsigned int seed; 4229995Sminshall char *string; 4329995Sminshall { 4429995Sminshall register unsigned int i = seed; 4529995Sminshall register unsigned char c; 4629995Sminshall 4729995Sminshall while (c = *string++) { 4829995Sminshall if (c >= 0x60) { 4930086Sminshall c -= (0x60+0x20); 5029995Sminshall } else { 5129995Sminshall c -= 0x20; 5229995Sminshall } 5329995Sminshall i = (i>>26) + (i<<6) + (c&0x3f); 5429995Sminshall } 5529995Sminshall return i; 5629995Sminshall } 5729995Sminshall 5829995Sminshall void 5929995Sminshall add(first, second, value) 6030077Sminshall char *first, *second; 6130077Sminshall int value; 6229995Sminshall { 6329995Sminshall struct thing **item, *this; 6429995Sminshall 6529995Sminshall item = &firstentry(second); 6629995Sminshall this = (struct thing *) malloc(sizeof *this); 6729995Sminshall this->next = *item; 6829995Sminshall *item = this; 6929995Sminshall this->value = value; 7029995Sminshall strcpy(this->name, first); 7129995Sminshall strcpy(this->name+strlen(this->name), second); 7229995Sminshall } 7329995Sminshall 7429995Sminshall void 7530077Sminshall scanwhite(file, prefix) 7630077Sminshall char *file, /* Name of file to scan for whitespace prefix */ 7729995Sminshall *prefix; /* prefix of what should be picked up */ 7829995Sminshall { 7929995Sminshall FILE *ourfile; 8029995Sminshall char compare[100]; 8129995Sminshall char what[100], value[100]; 8229995Sminshall char line[200]; 8330077Sminshall 8430077Sminshall sprintf(compare, " %s%%[^,\t \n]", prefix); 8530077Sminshall if ((ourfile = fopen(file, "r")) == NULL) { 8630077Sminshall perror("fopen"); 8730077Sminshall exit(1); 8830077Sminshall } 8930077Sminshall while (!feof(ourfile)) { 9030077Sminshall if (fscanf(ourfile, compare, what) == 1) { 9130077Sminshall add(prefix, what, 0); 9230077Sminshall } 9330077Sminshall do { 9430077Sminshall if (fgets(line, sizeof line, ourfile) == NULL) { 9530077Sminshall if (!feof(ourfile)) { 9630077Sminshall perror("fgets"); 9730077Sminshall } 9830077Sminshall break; 9930077Sminshall } 10030077Sminshall } while (line[strlen(line)-1] != '\n'); 10130077Sminshall } 10230077Sminshall } 10330077Sminshall 10430077Sminshall void 10530077Sminshall scandefine(file, prefix) 10630077Sminshall char *file, /* Name of file to scan for #define prefix */ 10730077Sminshall *prefix; /* prefix of what should be picked up */ 10830077Sminshall { 10930077Sminshall FILE *ourfile; 11030077Sminshall char compare[100]; 11130077Sminshall char what[100], value[100]; 11230077Sminshall char line[200]; 11329995Sminshall int whatitis; 11429995Sminshall 11529995Sminshall sprintf(compare, "#define %s%%s %%s", prefix); 11629995Sminshall if ((ourfile = fopen(file, "r")) == NULL) { 11729995Sminshall perror("fopen"); 11829995Sminshall exit(1); 11929995Sminshall } 12029995Sminshall while (!feof(ourfile)) { 12129995Sminshall if (fscanf(ourfile, compare, what, value) == 2) { 12229995Sminshall if (value[0] == '0') { 12329995Sminshall if ((value[1] == 'x') || (value[1] == 'X')) { 12429995Sminshall sscanf(value, "0x%x", &whatitis); 12529995Sminshall } else { 12629995Sminshall sscanf(value, "0%o", &whatitis); 12729995Sminshall } 12829995Sminshall } else { 12929995Sminshall sscanf(value, "%d", &whatitis); 13029995Sminshall } 13129995Sminshall add(prefix, what, whatitis); 13229995Sminshall } 13329995Sminshall do { 13429995Sminshall if (fgets(line, sizeof line, ourfile) == NULL) { 13529995Sminshall if (!feof(ourfile)) { 13629995Sminshall perror("fgets"); 13729995Sminshall } 13829995Sminshall break; 13929995Sminshall } 14029995Sminshall } while (line[strlen(line)-1] != '\n'); 14129995Sminshall } 14229995Sminshall } 14329995Sminshall 14430052Sminshall char *savechr(c) 14530052Sminshall unsigned char c; 14630052Sminshall { 14730052Sminshall char *foo; 14829995Sminshall 14930052Sminshall foo = malloc(sizeof c); 15030052Sminshall if (foo == 0) { 15130052Sminshall fprintf(stderr, "No room for ascii characters!\n"); 15230052Sminshall exit(1); 15330052Sminshall } 15430052Sminshall *foo = c; 15530052Sminshall return foo; 15630052Sminshall } 15730052Sminshall 15829995Sminshall char * 15929995Sminshall doit(hit, type, hits) 16029995Sminshall struct hit *hit; 16129995Sminshall unsigned char *type; 16229995Sminshall struct Hits *hits; 16329995Sminshall { 16429995Sminshall struct thing *this; 16529995Sminshall 16630077Sminshall hit->ctlrfcn = FCN_NULL; 16729995Sminshall if (type[0] == 0) { 16829995Sminshall return 0; 16929995Sminshall } 17029995Sminshall if (type[1] == 0) { /* character */ 17130077Sminshall hit->ctlrfcn = FCN_CHARACTER; 17231614Sminshall hit->code = ebc_disp[asc_ebc[type[0]]]; 17330052Sminshall return savechr(*type); /* The character is the name */ 17429995Sminshall } else { 17529995Sminshall for (this = firstentry(type); this; this = this->next) { 17629995Sminshall if ((type[0] == this->name[4]) 17729995Sminshall && (strcmp(type, this->name+4) == 0)) { 17829995Sminshall this->hits = hits; 17929995Sminshall if (this->name[0] == 'F') { 18030077Sminshall hit->ctlrfcn = FCN_NULL; /* XXX */ 18129995Sminshall } else { 18230077Sminshall hit->ctlrfcn = FCN_AID; 18329995Sminshall } 18429995Sminshall return this->name; 18529995Sminshall } 18629995Sminshall } 18730052Sminshall fprintf(stderr, "Error: Unknown type %s.\n", type); 18829995Sminshall return 0; 18929995Sminshall } 19029995Sminshall } 19129995Sminshall 19229995Sminshall 19329995Sminshall void 19430077Sminshall dohits(aidfile, fcnfile) 19530077Sminshall char *aidfile, *fcnfile; 19629995Sminshall { 19729995Sminshall unsigned char plain[100], shifted[100], alted[100], shiftalted[100]; 19829995Sminshall unsigned char line[200]; 19929995Sminshall int keynumber, scancode; 20029995Sminshall int empty; 20129995Sminshall int i; 20229995Sminshall struct hit *hit; 20329995Sminshall struct hits *ph; 20429995Sminshall struct Hits *Ph; 20529995Sminshall 20629995Sminshall memset((char *)Hits, 0, sizeof Hits); 20729995Sminshall 20829995Sminshall /* 20929995Sminshall * First, we read "host3270.h" to find the names/values of 21029995Sminshall * various AID; then we read kbd3270.h to find the names/values 21129995Sminshall * of various FCNs. 21229995Sminshall */ 21329995Sminshall 21430077Sminshall if (aidfile == 0) { 21530077Sminshall aidfile = "../ctlr/hostctlr.h"; 21630077Sminshall } 21730077Sminshall scandefine(aidfile, "AID_"); 21830077Sminshall if (fcnfile == 0) { 21930077Sminshall fcnfile = "../ctlr/function.h"; 22030077Sminshall } 22130077Sminshall scanwhite(fcnfile, "FCN_"); 22229995Sminshall 22329995Sminshall while (gets(line) != NULL) { 22429995Sminshall if (!isdigit(line[0])) { 22529995Sminshall continue; 22629995Sminshall } 22729995Sminshall plain[0] = shifted[0] = alted[0] = shiftalted[0] = 0; 22829995Sminshall keynumber = -1; 22929995Sminshall scancode = -1; 23029995Sminshall (void) sscanf(line, "%d %x %s %s %s %s", &keynumber, 23129995Sminshall &scancode, plain, shifted, alted, shiftalted); 23229995Sminshall if ((keynumber == -1) || (scancode == -1) 23329995Sminshall || ((plain[0] == 0) 23429995Sminshall && (shifted[0] == 0) 23529995Sminshall && (alted[0] == 0) 23629995Sminshall && (shiftalted[0] == 0))) { 23729995Sminshall continue; 23829995Sminshall } 23929995Sminshall if (scancode >= 256) { 24030052Sminshall fprintf(stderr, 24130052Sminshall "Error: scancode 0x%02x for keynumber %d\n", scancode, 24229995Sminshall keynumber); 24329995Sminshall break; 24429995Sminshall } 24530077Sminshall if (Hits[scancode].hits.hit[0].ctlrfcn != undefined) { 24630052Sminshall fprintf(stderr, 24730052Sminshall "Error: duplicate scancode 0x%02x for keynumber %d\n", 24829995Sminshall scancode, keynumber); 24929995Sminshall break; 25029995Sminshall } 25129995Sminshall hit = Hits[scancode].hits.hit; 25229995Sminshall Hits[scancode].hits.keynumber = keynumber; 25329995Sminshall Hits[scancode].name[0] = doit(hit, plain, &Hits[scancode]); 25429995Sminshall Hits[scancode].name[1] = doit(hit+1, shifted, &Hits[scancode]); 25529995Sminshall Hits[scancode].name[2] = doit(hit+2, alted, &Hits[scancode]); 25629995Sminshall Hits[scancode].name[3] = doit(hit+3, shiftalted, &Hits[scancode]); 25729995Sminshall } 25829995Sminshall } 259