Annotation of 43BSDReno/usr.bin/tn3270/tools/dohits.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1988 Regents of the University of California.
        !             3:  * All rights reserved.
        !             4:  *
        !             5:  * Redistribution and use in source and binary forms are permitted
        !             6:  * provided that the above copyright notice and this paragraph are
        !             7:  * duplicated in all such forms and that any documentation,
        !             8:  * advertising materials, and other materials related to such
        !             9:  * distribution and use acknowledge that the software was developed
        !            10:  * by the University of California, Berkeley.  The name of the
        !            11:  * University may not be used to endorse or promote products derived
        !            12:  * from this software without specific prior written permission.
        !            13:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
        !            14:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
        !            15:  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !            16:  */
        !            17: 
        !            18: #ifndef lint
        !            19: static char sccsid[] = "@(#)dohits.c   4.1 (Berkeley) 12/4/88";
        !            20: #endif /* not lint */
        !            21: 
        !            22: /*
        !            23:  * This program scans a file which describes a keyboard.  The output
        !            24:  * of the program is a series of 'C' declarations which describe a
        !            25:  * mapping between (scancode, shiftstate, altstate) and 3270 functions,
        !            26:  * characters, and AIDs.
        !            27:  *
        !            28:  * The format of the input file is as follows:
        !            29:  *
        !            30:  * keynumber [ scancode [ unshifted [ shifted [ alted [ shiftalted ] ] ] ] ]
        !            31:  *
        !            32:  * keynumber is in decimal, and starts in column 1.
        !            33:  * scancode is hexadecimal.
        !            34:  * unshifted, etc. - these are either a single ascii character,
        !            35:  *                     or the name of a function or an AID-generating key.
        !            36:  *
        !            37:  * all fields are separated by a single space.
        !            38:  */
        !            39: 
        !            40: #include <stdio.h>
        !            41: #if    defined(unix)
        !            42: #include <strings.h>
        !            43: #else  /* defined(unix) */
        !            44: #include <string.h>
        !            45: #endif /* defined(unix) */
        !            46: #include <ctype.h>
        !            47: #include "../general/general.h"
        !            48: #include "../api/asc_ebc.h"
        !            49: #include "../api/ebc_disp.h"
        !            50: #include "../ctlr/function.h"
        !            51: 
        !            52: #include "dohits.h"
        !            53: 
        !            54: struct Hits Hits[256];         /* one for each of 0x00-0xff */
        !            55: 
        !            56: struct thing *table[100];
        !            57: 
        !            58: extern char *malloc();
        !            59: 
        !            60: unsigned int
        !            61: dohash(seed, string)
        !            62: unsigned int seed;
        !            63: char *string;
        !            64: {
        !            65:     register unsigned int i = seed;
        !            66:     register unsigned char c;
        !            67: 
        !            68:     while (c = *string++) {
        !            69:        if (c >= 0x60) {
        !            70:            c -= (0x60+0x20);
        !            71:        } else {
        !            72:            c -= 0x20;
        !            73:        }
        !            74:        i = (i>>26) + (i<<6) + (c&0x3f);
        !            75:     }
        !            76:     return i;
        !            77: }
        !            78: 
        !            79: void
        !            80: add(first, second, value)
        !            81: char *first, *second;
        !            82: int value;
        !            83: {
        !            84:     struct thing **item, *this;
        !            85: 
        !            86:     item = &firstentry(second);
        !            87:     this = (struct thing *) malloc(sizeof *this);
        !            88:     this->next = *item;
        !            89:     *item = this;
        !            90:     this->value = value;
        !            91:     strcpy(this->name, first);
        !            92:     strcpy(this->name+strlen(this->name), second);
        !            93: }
        !            94: 
        !            95: void
        !            96: scanwhite(file, prefix)
        !            97: char *file,            /* Name of file to scan for whitespace prefix */
        !            98:      *prefix;          /* prefix of what should be picked up */
        !            99: {
        !           100:     FILE *ourfile;
        !           101:     char compare[100];
        !           102:     char what[100], value[100];
        !           103:     char line[200];
        !           104: 
        !           105:     sprintf(compare, " %s%%[^,\t \n]", prefix);
        !           106:     if ((ourfile = fopen(file, "r")) == NULL) {
        !           107:        perror("fopen");
        !           108:        exit(1);
        !           109:     }
        !           110:     while (!feof(ourfile)) {
        !           111:        if (fscanf(ourfile, compare,  what) == 1) {
        !           112:            add(prefix, what, 0);
        !           113:        }
        !           114:        do {
        !           115:            if (fgets(line, sizeof line, ourfile) == NULL) {
        !           116:                if (!feof(ourfile)) {
        !           117:                    perror("fgets");
        !           118:                }
        !           119:                break;
        !           120:            }
        !           121:        } while (line[strlen(line)-1] != '\n');
        !           122:     }
        !           123: }
        !           124: 
        !           125: void
        !           126: scandefine(file, prefix)
        !           127: char *file,            /* Name of file to scan for #define prefix */
        !           128:      *prefix;          /* prefix of what should be picked up */
        !           129: {
        !           130:     FILE *ourfile;
        !           131:     char compare[100];
        !           132:     char what[100], value[100];
        !           133:     char line[200];
        !           134:     int whatitis;
        !           135: 
        !           136:     sprintf(compare, "#define %s%%s %%s", prefix);
        !           137:     if ((ourfile = fopen(file, "r")) == NULL) {
        !           138:        perror("fopen");
        !           139:        exit(1);
        !           140:     }
        !           141:     while (!feof(ourfile)) {
        !           142:        if (fscanf(ourfile, compare,  what, value) == 2) {
        !           143:            if (value[0] == '0') {
        !           144:                if ((value[1] == 'x') || (value[1] == 'X')) {
        !           145:                    sscanf(value, "0x%x", &whatitis);
        !           146:                } else {
        !           147:                    sscanf(value, "0%o", &whatitis);
        !           148:                }
        !           149:            } else {
        !           150:                sscanf(value, "%d", &whatitis);
        !           151:            }
        !           152:            add(prefix, what, whatitis);
        !           153:        }
        !           154:        do {
        !           155:            if (fgets(line, sizeof line, ourfile) == NULL) {
        !           156:                if (!feof(ourfile)) {
        !           157:                    perror("fgets");
        !           158:                }
        !           159:                break;
        !           160:            }
        !           161:        } while (line[strlen(line)-1] != '\n');
        !           162:     }
        !           163: }
        !           164: 
        !           165: char *savechr(c)
        !           166: unsigned char c;
        !           167: {
        !           168:     char *foo;
        !           169: 
        !           170:     foo = malloc(sizeof c);
        !           171:     if (foo == 0) {
        !           172:        fprintf(stderr, "No room for ascii characters!\n");
        !           173:        exit(1);
        !           174:     }
        !           175:     *foo = c;
        !           176:     return foo;
        !           177: }
        !           178: 
        !           179: char *
        !           180: doit(hit, type, hits)
        !           181: struct hit *hit;
        !           182: unsigned char *type;
        !           183: struct Hits *hits;
        !           184: {
        !           185:     struct thing *this;
        !           186: 
        !           187:     hit->ctlrfcn = FCN_NULL;
        !           188:     if (type[0] == 0) {
        !           189:        return 0;
        !           190:     }
        !           191:     if (type[1] == 0) {                /* character */
        !           192:        hit->ctlrfcn = FCN_CHARACTER;
        !           193:        hit->code = ebc_disp[asc_ebc[type[0]]];
        !           194:        return savechr(*type);          /* The character is the name */
        !           195:     } else {
        !           196:        for (this = firstentry(type); this; this = this->next) {
        !           197:            if ((type[0] == this->name[4])
        !           198:                                && (strcmp(type, this->name+4) == 0)) {
        !           199:                this->hits = hits;
        !           200:                if (this->name[0] == 'F') {
        !           201:                    hit->ctlrfcn = FCN_NULL;    /* XXX */
        !           202:                } else {
        !           203:                    hit->ctlrfcn = FCN_AID;
        !           204:                }
        !           205:                return this->name;
        !           206:            }
        !           207:        }
        !           208:        fprintf(stderr, "Error: Unknown type %s.\n", type);
        !           209:        return 0;
        !           210:     }
        !           211: }
        !           212: 
        !           213: 
        !           214: void
        !           215: dohits(aidfile, fcnfile)
        !           216: char   *aidfile, *fcnfile;
        !           217: {
        !           218:     unsigned char plain[100], shifted[100], alted[100], shiftalted[100];
        !           219:     unsigned char line[200];
        !           220:     int keynumber, scancode;
        !           221:     int empty;
        !           222:     int i;
        !           223:     struct hit *hit;
        !           224:     struct hits *ph;
        !           225:     struct Hits *Ph;
        !           226: 
        !           227:     memset((char *)Hits, 0, sizeof Hits);
        !           228: 
        !           229:     /*
        !           230:      * First, we read "host3270.h" to find the names/values of
        !           231:      * various AID; then we read kbd3270.h to find the names/values
        !           232:      * of various FCNs.
        !           233:      */
        !           234: 
        !           235:     if (aidfile == 0) {
        !           236:        aidfile = "../ctlr/hostctlr.h";
        !           237:     }
        !           238:     scandefine(aidfile, "AID_");
        !           239:     if (fcnfile == 0) {
        !           240:         fcnfile = "../ctlr/function.h";
        !           241:     }
        !           242:     scanwhite(fcnfile, "FCN_");
        !           243: 
        !           244:     while (gets(line) != NULL) {
        !           245:        if (!isdigit(line[0])) {
        !           246:            continue;
        !           247:        }
        !           248:        plain[0] = shifted[0] = alted[0] = shiftalted[0] = 0;
        !           249:        keynumber = -1;
        !           250:        scancode = -1;
        !           251:        (void) sscanf(line, "%d %x %s %s %s %s", &keynumber,
        !           252:                    &scancode, plain, shifted, alted, shiftalted);
        !           253:        if ((keynumber == -1) || (scancode == -1)
        !           254:                || ((plain[0] == 0)
        !           255:                    && (shifted[0] == 0)
        !           256:                    && (alted[0] == 0)
        !           257:                    && (shiftalted[0] == 0))) {
        !           258:            continue;
        !           259:        }
        !           260:        if (scancode >= 256) {
        !           261:            fprintf(stderr,
        !           262:                "Error: scancode 0x%02x for keynumber %d\n", scancode,
        !           263:                    keynumber);
        !           264:            break;
        !           265:        }
        !           266:        if (Hits[scancode].hits.hit[0].ctlrfcn != undefined) {
        !           267:            fprintf(stderr,
        !           268:                "Error: duplicate scancode 0x%02x for keynumber %d\n",
        !           269:                    scancode, keynumber);
        !           270:            break;
        !           271:        }
        !           272:        hit = Hits[scancode].hits.hit;
        !           273:        Hits[scancode].hits.keynumber = keynumber;
        !           274:        Hits[scancode].name[0] = doit(hit, plain, &Hits[scancode]);
        !           275:        Hits[scancode].name[1] = doit(hit+1, shifted, &Hits[scancode]);
        !           276:        Hits[scancode].name[2] = doit(hit+2, alted, &Hits[scancode]);
        !           277:        Hits[scancode].name[3] = doit(hit+3, shiftalted, &Hits[scancode]);
        !           278:     }
        !           279: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.