Annotation of 43BSDReno/usr.bin/tn3270/ascii/map3270.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[] = "@(#)map3270.c  4.1 (Berkeley) 12/4/88";
        !            20: #endif /* not lint */
        !            21: 
        !            22: /*     This program reads a description file, somewhat like /etc/termcap,
        !            23:     that describes the mapping between the current terminal's keyboard and
        !            24:     a 3270 keyboard.
        !            25:  */
        !            26: #ifdef DOCUMENTATION_ONLY
        !            27: /* here is a sample (very small) entry...
        !            28: 
        !            29:        # this table is sensitive to position on a line.  In particular,
        !            30:        # a terminal definition for a terminal is terminated whenever a
        !            31:        # (non-comment) line beginning in column one is found.
        !            32:        #
        !            33:        # this is an entry to map tvi924 to 3270 keys...
        !            34:        v8|tvi924|924|televideo model 924 {
        !            35:                pfk1 =  '\E1';
        !            36:                pfk2 =  '\E2';
        !            37:                clear = '^z';           # clear the screen
        !            38:        }
        !            39:  */
        !            40: #endif /* DOCUMENTATION_ONLY */
        !            41: 
        !            42: #include <stdio.h>
        !            43: #include <ctype.h>
        !            44: #if    defined(unix)
        !            45: #include <strings.h>
        !            46: #else  /* defined(unix) */
        !            47: #include <string.h>
        !            48: #endif /* defined(unix) */
        !            49: 
        !            50: #define        IsPrint(c)      ((isprint(c) && !isspace(c)) || ((c) == ' '))
        !            51: 
        !            52: #include "state.h"
        !            53: #include "map3270.h"
        !            54: 
        !            55: #include "../general/globals.h"
        !            56: 
        !            57: /* this is the list of types returned by the lex processor */
        !            58: #define        LEX_CHAR        400                     /* plain unadorned character */
        !            59: #define        LEX_ESCAPED     LEX_CHAR+1              /* escaped with \ */
        !            60: #define        LEX_CARETED     LEX_ESCAPED+1           /* escaped with ^ */
        !            61: #define        LEX_END_OF_FILE LEX_CARETED+1           /* end of file encountered */
        !            62: #define        LEX_ILLEGAL     LEX_END_OF_FILE+1       /* trailing escape character */
        !            63: 
        !            64: /* the following is part of our character set dependancy... */
        !            65: #define        ESCAPE          0x1b
        !            66: #define        TAB             0x09
        !            67: #define        NEWLINE         0x0a
        !            68: #define        CARRIAGE_RETURN 0x0d
        !            69: 
        !            70: typedef struct {
        !            71:     int type;          /* LEX_* - type of character */
        !            72:     int value;         /* character this was */
        !            73: } lexicon;
        !            74: 
        !            75: typedef struct {
        !            76:     int                length;         /* length of character string */
        !            77:     char       array[500];     /* character string */
        !            78: } stringWithLength;
        !            79: 
        !            80: #define        panic(s)        { fprintf(stderr, s); exit(1); }
        !            81: 
        !            82: static state firstentry = { 0, STATE_NULL, 0, 0 };
        !            83: static state *headOfQueue = &firstentry;
        !            84: 
        !            85: /* the following is a primitive adm3a table, to be used when nothing
        !            86:  * else seems to be avaliable.
        !            87:  */
        !            88: 
        !            89: #ifdef DEBUG
        !            90: static int debug = 0;          /* debug flag (for debuggin tables) */
        !            91: #endif /* DEBUG */
        !            92: 
        !            93: static int (*GetTc)();
        !            94: static int doPaste = 1;                /* should we have side effects */
        !            95: static int picky = 0;          /* do we complain of unknown functions? */
        !            96: static char usePointer = 0;    /* use pointer, or file */
        !            97: static FILE *ourFile= 0;
        !            98: static char *environPointer = 0;/* if non-zero, point to input
        !            99:                                 * string in core.
        !           100:                                 */
        !           101: static char **whichkey = 0;
        !           102: static char *keysgeneric[] = {
        !           103: #include "default.map"         /* Define the default default */
        !           104: 
        !           105:        0,                      /* Terminate list of entries */
        !           106: };
        !           107:                        ;
        !           108: 
        !           109: static int     Empty = 1,              /* is the unget lifo empty? */
        !           110:                Full = 0;               /* is the unget lifo full? */
        !           111: static lexicon lifo[200] = { 0 };      /* character stack for parser */
        !           112: static int     rp = 0,                 /* read pointer into lifo */
        !           113:                wp = 0;                 /* write pointer into lifo */
        !           114: 
        !           115: static int
        !           116: GetC()
        !           117: {
        !           118:     int character;
        !           119: 
        !           120:     if (usePointer) {
        !           121:        if ((*environPointer) == 0) {
        !           122:            /*
        !           123:             * If we have reached the end of this string, go on to
        !           124:             * the next (if there is a next).
        !           125:             */
        !           126:            if (whichkey == 0) {
        !           127:                static char suffix = 'A';       /* From environment */
        !           128:                char envname[9];
        !           129:                extern char *getenv();
        !           130: 
        !           131:                (void) sprintf(envname, "MAP3270%c", suffix++);
        !           132:                environPointer = getenv(envname);
        !           133:            } else {
        !           134:                whichkey++;                     /* default map */
        !           135:                environPointer = *whichkey;
        !           136:            }
        !           137:        }
        !           138:        if (*environPointer) {
        !           139:           character = 0xff&*environPointer++;
        !           140:        } else {
        !           141:           character = EOF;
        !           142:        }
        !           143:     } else {
        !           144:        character = getc(ourFile);
        !           145:     }
        !           146:     return(character);
        !           147: }
        !           148: 
        !           149: static lexicon
        !           150: Get()
        !           151: {
        !           152:     lexicon c;
        !           153:     register lexicon *pC = &c;
        !           154:     register int character;
        !           155: 
        !           156:     if (!Empty) {
        !           157:        *pC = lifo[rp];
        !           158:        rp++;
        !           159:        if (rp == sizeof lifo/sizeof (lexicon)) {
        !           160:            rp = 0;
        !           161:        }
        !           162:        if (rp == wp) {
        !           163:            Empty = 1;
        !           164:        }
        !           165:        Full = 0;
        !           166:     } else {
        !           167:        character = GetC();
        !           168:        switch (character) {
        !           169:        case EOF:
        !           170:            pC->type = LEX_END_OF_FILE;
        !           171:            break;
        !           172:        case '^':
        !           173:            character = GetC();
        !           174:            if (!IsPrint(character)) {
        !           175:                pC->type = LEX_ILLEGAL;
        !           176:            } else {
        !           177:                pC->type = LEX_CARETED;
        !           178:                if (character == '?') {
        !           179:                    character |= 0x40;  /* rubout */
        !           180:                } else {
        !           181:                    character &= 0x1f;
        !           182:                }
        !           183:            }
        !           184:            break;
        !           185:        case '\\':
        !           186:            character = GetC();
        !           187:            if (!IsPrint(character)) {
        !           188:                pC->type = LEX_ILLEGAL;
        !           189:            } else {
        !           190:                pC->type = LEX_ESCAPED;
        !           191:                switch (character) {
        !           192:                case 'E': case 'e':
        !           193:                    character = ESCAPE;
        !           194:                    break;
        !           195:                case 't':
        !           196:                    character = TAB;
        !           197:                    break;
        !           198:                case 'n':
        !           199:                    character = NEWLINE;
        !           200:                    break;
        !           201:                case 'r':
        !           202:                    character = CARRIAGE_RETURN;
        !           203:                    break;
        !           204:                default:
        !           205:                    pC->type = LEX_ILLEGAL;
        !           206:                    break;
        !           207:                }
        !           208:            }
        !           209:            break;
        !           210:        default:
        !           211:            if ((IsPrint(character)) || isspace(character)) {
        !           212:                pC->type = LEX_CHAR;
        !           213:            } else {
        !           214:                pC->type = LEX_ILLEGAL;
        !           215:            }
        !           216:            break;
        !           217:        }
        !           218:        pC->value = character;
        !           219:     }
        !           220:     return(*pC);
        !           221: }
        !           222: 
        !           223: static void
        !           224: UnGet(c)
        !           225: lexicon c;                     /* character to unget */
        !           226: {
        !           227:     if (Full) {
        !           228:        fprintf(stderr, "attempt to put too many characters in lifo\n");
        !           229:        panic("map3270");
        !           230:        /* NOTREACHED */
        !           231:     } else {
        !           232:        lifo[wp] = c;
        !           233:        wp++;
        !           234:        if (wp == sizeof lifo/sizeof (lexicon)) {
        !           235:            wp = 0;
        !           236:        }
        !           237:        if (wp == rp) {
        !           238:            Full = 1;
        !           239:        }
        !           240:        Empty = 0;
        !           241:     }
        !           242: }
        !           243: 
        !           244: /*
        !           245:  * Construct a control character sequence
        !           246:  * for a special character.
        !           247:  */
        !           248: char *
        !           249: uncontrol(c)
        !           250:        register int c;
        !           251: {
        !           252:        static char buf[3];
        !           253: 
        !           254:        if (c == 0x7f)
        !           255:                return ("^?");
        !           256:        if (c == '\377') {
        !           257:                return "-1";
        !           258:        }
        !           259:        if (c >= 0x20) {
        !           260:                buf[0] = c;
        !           261:                buf[1] = 0;
        !           262:        } else {
        !           263:                buf[0] = '^';
        !           264:                buf[1] = '@'+c;
        !           265:                buf[2] = 0;
        !           266:        }
        !           267:        return (buf);
        !           268: }
        !           269: 
        !           270: /* compare two strings, ignoring case */
        !           271: 
        !           272: ustrcmp(string1, string2)
        !           273: register char *string1;
        !           274: register char *string2;
        !           275: {
        !           276:     register int c1, c2;
        !           277: 
        !           278:     while ((c1 = (unsigned char) *string1++) != 0) {
        !           279:        if (isupper(c1)) {
        !           280:            c1 = tolower(c1);
        !           281:        }
        !           282:        if (isupper(c2 = (unsigned char) *string2++)) {
        !           283:            c2 = tolower(c2);
        !           284:        }
        !           285:        if (c1 < c2) {
        !           286:            return(-1);
        !           287:        } else if (c1 > c2) {
        !           288:            return(1);
        !           289:        }
        !           290:     }
        !           291:     if (*string2) {
        !           292:        return(-1);
        !           293:     } else {
        !           294:        return(0);
        !           295:     }
        !           296: }
        !           297: 
        !           298: 
        !           299: static stringWithLength *
        !           300: GetQuotedString()
        !           301: {
        !           302:     lexicon lex;
        !           303:     static stringWithLength output = { 0 };    /* where return value is held */
        !           304:     char *pointer = output.array;
        !           305: 
        !           306:     lex = Get();
        !           307:     if ((lex.type != LEX_CHAR) || (lex.value != '\'')) {
        !           308:        UnGet(lex);
        !           309:        return(0);
        !           310:     }
        !           311:     while (1) {
        !           312:        lex = Get();
        !           313:        if ((lex.type == LEX_CHAR) && (lex.value == '\'')) {
        !           314:            break;
        !           315:        }
        !           316:        if ((lex.type == LEX_CHAR) && !IsPrint(lex.value)) {
        !           317:            UnGet(lex);
        !           318:            return(0);          /* illegal character in quoted string */
        !           319:        }
        !           320:        if (pointer >= output.array+sizeof output.array) {
        !           321:            return(0);          /* too long */
        !           322:        }
        !           323:        *pointer++ = lex.value;
        !           324:     }
        !           325:     output.length = pointer-output.array;
        !           326:     return(&output);
        !           327: }
        !           328: 
        !           329: #ifdef NOTUSED
        !           330: static stringWithLength *
        !           331: GetCharString()
        !           332: {
        !           333:     lexicon lex;
        !           334:     static stringWithLength output;
        !           335:     char *pointer = output.array;
        !           336: 
        !           337:     lex = Get();
        !           338: 
        !           339:     while ((lex.type == LEX_CHAR) &&
        !           340:                        !isspace(lex.value) && (lex.value != '=')) {
        !           341:        *pointer++ = lex.value;
        !           342:        lex = Get();
        !           343:        if (pointer >= output.array + sizeof output.array) {
        !           344:            return(0);          /* too long */
        !           345:        }
        !           346:     }
        !           347:     UnGet(lex);
        !           348:     output.length = pointer-output.array;
        !           349:     return(&output);
        !           350: }
        !           351: #endif /* NOTUSED */
        !           352: 
        !           353: static
        !           354: GetCharacter(character)
        !           355: int    character;              /* desired character */
        !           356: {
        !           357:     lexicon lex;
        !           358: 
        !           359:     lex = Get();
        !           360: 
        !           361:     if ((lex.type != LEX_CHAR) || (lex.value != character)) {
        !           362:        UnGet(lex);
        !           363:        return(0);
        !           364:     }
        !           365:     return(1);
        !           366: }
        !           367: 
        !           368: #ifdef NOTUSED
        !           369: static
        !           370: GetString(string)
        !           371: char   *string;                /* string to get */
        !           372: {
        !           373:     lexicon lex;
        !           374: 
        !           375:     while (*string) {
        !           376:        lex = Get();
        !           377:        if ((lex.type != LEX_CHAR) || (lex.value != *string&0xff)) {
        !           378:            UnGet(lex);
        !           379:            return(0);          /* XXX restore to state on entry */
        !           380:        }
        !           381:        string++;
        !           382:     }
        !           383:     return(1);
        !           384: }
        !           385: #endif /* NOTUSED */
        !           386: 
        !           387: 
        !           388: static stringWithLength *
        !           389: GetAlphaMericString()
        !           390: {
        !           391:     lexicon lex;
        !           392:     static stringWithLength output = { 0 };
        !           393:     char *pointer = output.array;
        !           394: #   define     IsAlnum(c)      (isalnum(c) || (c == '_') \
        !           395:                                        || (c == '-') || (c == '.'))
        !           396: 
        !           397:     lex = Get();
        !           398: 
        !           399:     if ((lex.type != LEX_CHAR) || !IsAlnum(lex.value)) {
        !           400:        UnGet(lex);
        !           401:        return(0);
        !           402:     }
        !           403: 
        !           404:     while ((lex.type == LEX_CHAR) && IsAlnum(lex.value)) {
        !           405:        *pointer++ = lex.value;
        !           406:        lex = Get();
        !           407:     }
        !           408:     UnGet(lex);
        !           409:     *pointer = 0;
        !           410:     output.length = pointer-output.array;
        !           411:     return(&output);
        !           412: }
        !           413: 
        !           414: 
        !           415: /* eat up characters until a new line, or end of file.  returns terminating
        !           416:        character.
        !           417:  */
        !           418: 
        !           419: static lexicon
        !           420: EatToNL()
        !           421: {
        !           422:     lexicon lex;
        !           423: 
        !           424:     lex = Get();
        !           425: 
        !           426:     while (!((lex.type != LEX_ESCAPED) && (lex.type != LEX_CARETED) && 
        !           427:                (lex.value == '\n')) && (!(lex.type == LEX_END_OF_FILE))) {
        !           428:        lex = Get();
        !           429:     }
        !           430:     if (lex.type != LEX_END_OF_FILE) {
        !           431:        return(Get());
        !           432:     } else {
        !           433:        return(lex);
        !           434:     }
        !           435: }
        !           436: 
        !           437: 
        !           438: static void
        !           439: GetWS()
        !           440: {
        !           441:     lexicon lex;
        !           442: 
        !           443:     lex = Get();
        !           444: 
        !           445:     while ((lex.type == LEX_CHAR) &&
        !           446:                        (isspace(lex.value) || (lex.value == '#'))) {
        !           447:        if (lex.value == '#') {
        !           448:            lex = EatToNL();
        !           449:        } else {
        !           450:            lex = Get();
        !           451:        }
        !           452:     }
        !           453:     UnGet(lex);
        !           454: }
        !           455: 
        !           456: static void
        !           457: FreeState(pState)
        !           458: state *pState;
        !           459: {
        !           460:     extern int free();
        !           461: 
        !           462:     free((char *)pState);
        !           463: }
        !           464: 
        !           465: 
        !           466: static state *
        !           467: GetState()
        !           468: {
        !           469:     state *pState;
        !           470:     extern char *malloc();
        !           471: 
        !           472:     pState = (state *) malloc(sizeof (state));
        !           473: 
        !           474:     pState->result = STATE_NULL;
        !           475:     pState->next = 0;
        !           476: 
        !           477:     return(pState);
        !           478: }
        !           479: 
        !           480: 
        !           481: static state *
        !           482: FindMatchAtThisLevel(pState, character)
        !           483: state  *pState;
        !           484: int    character;
        !           485: {
        !           486:     while (pState) {
        !           487:        if (pState->match == character) {
        !           488:            return(pState);
        !           489:        }
        !           490:        pState = pState->next;
        !           491:     }
        !           492:     return(0);
        !           493: }
        !           494: 
        !           495: 
        !           496: static state *
        !           497: PasteEntry(head, string, count, identifier)
        !           498: state                  *head;          /* points to who should point here... */
        !           499: char                   *string;        /* which characters to paste */
        !           500: int                    count;          /* number of character to do */
        !           501: char                   *identifier;    /* for error messages */
        !           502: {
        !           503:     state *pState, *other;
        !           504: 
        !           505:     if (!doPaste) {            /* flag to not have any side effects */
        !           506:        return((state *)1);
        !           507:     }
        !           508:     if (!count) {
        !           509:        return(head);   /* return pointer to the parent */
        !           510:     }
        !           511:     if ((head->result != STATE_NULL) && (head->result != STATE_GOTO)) {
        !           512:        /* this means that a previously defined sequence is an initial
        !           513:         * part of this one.
        !           514:         */
        !           515:        fprintf(stderr, "Conflicting entries found when scanning %s\n",
        !           516:                identifier);
        !           517:        return(0);
        !           518:     }
        !           519: #   ifdef      DEBUG
        !           520:        if (debug) {
        !           521:            fprintf(stderr, "%s", uncontrol(*string));
        !           522:        }
        !           523: #   endif      /* DEBUG */
        !           524:     pState = GetState();
        !           525:     pState->match = *string;
        !           526:     if (head->result == STATE_NULL) {
        !           527:        head->result = STATE_GOTO;
        !           528:        head->address = pState;
        !           529:        other = pState;
        !           530:     } else {           /* search for same character */
        !           531:        if ((other = FindMatchAtThisLevel(head->address, *string)) != 0) {
        !           532:            FreeState(pState);
        !           533:        } else {
        !           534:            pState->next = head->address;
        !           535:            head->address = pState;
        !           536:            other = pState;
        !           537:        }
        !           538:     }
        !           539:     return(PasteEntry(other, string+1, count-1, identifier));
        !           540: }
        !           541: 
        !           542: static
        !           543: GetInput(tc, identifier)
        !           544: int tc;
        !           545: char *identifier;              /* entry being parsed (for error messages) */
        !           546: {
        !           547:     stringWithLength *outputString;
        !           548:     state *head;
        !           549:     state fakeQueue;
        !           550: 
        !           551:     if (doPaste) {
        !           552:        head = headOfQueue;     /* always points to level above this one */
        !           553:     } else {
        !           554:        head = &fakeQueue;      /* don't have any side effects... */
        !           555:     }
        !           556: 
        !           557:     if ((outputString = GetQuotedString()) == 0) {
        !           558:        return(0);
        !           559:     } else if (IsPrint(outputString->array[0])) {
        !           560:        fprintf(stderr,
        !           561:         "first character of sequence for %s is not a control type character\n",
        !           562:                identifier);
        !           563:        return(0);
        !           564:     } else {
        !           565:        if ((head = PasteEntry(head, outputString->array,
        !           566:                                outputString->length, identifier)) == 0) {
        !           567:            return(0);
        !           568:        }
        !           569:        GetWS();
        !           570:        while ((outputString = GetQuotedString()) != 0) {
        !           571:            if ((head = PasteEntry(head, outputString->array,
        !           572:                                outputString->length, identifier)) == 0) {
        !           573:                return(0);
        !           574:            }
        !           575:            GetWS();
        !           576:        }
        !           577:     }
        !           578:     if (!doPaste) {
        !           579:        return(1);
        !           580:     }
        !           581:     if ((head->result != STATE_NULL) && (head->result != tc)) {
        !           582:        /* this means that this sequence is an initial part
        !           583:         * of a previously defined one.
        !           584:         */
        !           585:        fprintf(stderr, "Conflicting entries found when scanning %s\n",
        !           586:                identifier);
        !           587:        return(0);
        !           588:     } else {
        !           589:        head->result = tc;
        !           590:        return(1);              /* done */
        !           591:     }
        !           592: }
        !           593: 
        !           594: static
        !           595: GetDefinition()
        !           596: {
        !           597:     stringWithLength *string;
        !           598:     int Tc;
        !           599: 
        !           600:     GetWS();
        !           601:     if ((string = GetAlphaMericString()) == 0) {
        !           602:        return(0);
        !           603:     }
        !           604:     string->array[string->length] = 0;
        !           605:     if (doPaste) {
        !           606:        if ((Tc = (*GetTc)(string->array)) == -1) {
        !           607:            if (picky) {
        !           608:                fprintf(stderr, "%s: unknown 3270 key identifier\n",
        !           609:                                                        string->array);
        !           610:            }
        !           611:            Tc = STATE_NULL;
        !           612:        }
        !           613:     } else {
        !           614:        Tc = STATE_NULL;                /* XXX ? */
        !           615:     }
        !           616:     GetWS();
        !           617:     if (!GetCharacter('=')) {
        !           618:        fprintf(stderr,
        !           619:                "Required equal sign after 3270 key identifier %s missing\n",
        !           620:                        string->array);
        !           621:        return(0);
        !           622:     }
        !           623:     GetWS();
        !           624:     if (!GetInput(Tc, string->array)) {
        !           625:        fprintf(stderr, "Missing definition part for 3270 key %s\n",
        !           626:                                string->array);
        !           627:        return(0);
        !           628:     } else {
        !           629:        GetWS();
        !           630:        while (GetCharacter('|')) {
        !           631: #          ifdef       DEBUG
        !           632:                if (debug) {
        !           633:                    fprintf(stderr, " or ");
        !           634:                }
        !           635: #          endif       /* DEBUG */
        !           636:            GetWS();
        !           637:            if (!GetInput(Tc, string->array)) {
        !           638:                fprintf(stderr, "Missing definition part for 3270 key %s\n",
        !           639:                                        string->array);
        !           640:                return(0);
        !           641:            }
        !           642:            GetWS();
        !           643:        }
        !           644:     }
        !           645:     GetWS();
        !           646:     if (!GetCharacter(';')) {
        !           647:        fprintf(stderr, "Missing semi-colon for 3270 key %s\n", string->array);
        !           648:        return(0);
        !           649:     }
        !           650: #   ifdef      DEBUG
        !           651:        if (debug) {
        !           652:            fprintf(stderr, ";\n");
        !           653:        }
        !           654: #   endif      /* DEBUG */
        !           655:     return(1);
        !           656: }
        !           657: 
        !           658: 
        !           659: static
        !           660: GetDefinitions()
        !           661: {
        !           662:     if (!GetDefinition()) {
        !           663:        return(0);
        !           664:     } else {
        !           665:        while (GetDefinition()) {
        !           666:            ;
        !           667:        }
        !           668:     }
        !           669:     return(1);
        !           670: }
        !           671: 
        !           672: static
        !           673: GetBegin()
        !           674: {
        !           675:     GetWS();
        !           676:     if (!GetCharacter('{')) {
        !           677:        return(0);
        !           678:     }
        !           679:     return(1);
        !           680: }
        !           681: 
        !           682: static
        !           683: GetEnd()
        !           684: {
        !           685:     GetWS();
        !           686:     if (!GetCharacter('}')) {
        !           687:        return(0);
        !           688:     }
        !           689:     return(1);
        !           690: }
        !           691: 
        !           692: static
        !           693: GetName()
        !           694: {
        !           695:     if (!GetAlphaMericString()) {
        !           696:        return(0);
        !           697:     }
        !           698:     GetWS();
        !           699:     while (GetAlphaMericString()) {
        !           700:        GetWS();
        !           701:     }
        !           702:     return(1);
        !           703: }
        !           704: 
        !           705: static
        !           706: GetNames()
        !           707: {
        !           708:     GetWS();
        !           709:     if (!GetName()) {
        !           710:        return(0);
        !           711:     } else {
        !           712:        GetWS();
        !           713:        while (GetCharacter('|')) {
        !           714:            GetWS();
        !           715:            if (!GetName()) {
        !           716:                return(0);
        !           717:            }
        !           718:        }
        !           719:     }
        !           720:     return(1);
        !           721: }
        !           722: 
        !           723: static
        !           724: GetEntry0()
        !           725: {
        !           726:     if (!GetBegin()) {
        !           727:        fprintf(stderr, "no '{'\n");
        !           728:        return(0);
        !           729:     } else if (!GetDefinitions()) {
        !           730:        fprintf(stderr, "unable to parse the definitions\n");
        !           731:        return(0);
        !           732:     } else if (!GetEnd()) {
        !           733:        fprintf(stderr, "No '}' or scanning stopped early due to error.\n");
        !           734:        return(0);
        !           735:     } else {
        !           736:        /* done */
        !           737:        return(1);
        !           738:     }
        !           739: }
        !           740: 
        !           741: 
        !           742: static
        !           743: GetEntry()
        !           744: {
        !           745:     if (!GetNames()) {
        !           746:        fprintf(stderr, "Invalid name field in entry.\n");
        !           747:        return(0);
        !           748:     } else {
        !           749:        return(GetEntry0());
        !           750:     }
        !           751: }
        !           752: 
        !           753: /* position ourselves within a given filename to the entry for the current
        !           754:  *     KEYBD (or TERM) variable
        !           755:  */
        !           756: 
        !           757: Position(filename, keybdPointer)
        !           758: char *filename;
        !           759: char *keybdPointer;
        !           760: {
        !           761:     lexicon lex;
        !           762:     stringWithLength *name = 0;
        !           763:     stringWithLength *oldName;
        !           764: #   define     Return(x) {doPaste = 1; return(x);}
        !           765: 
        !           766:     doPaste = 0;
        !           767: 
        !           768:     if ((ourFile = fopen(filename, "r")) == NULL) {
        !           769: #   if !defined(MSDOS)
        !           770:        fprintf(stderr, "Unable to open file %s\n", filename);
        !           771: #   endif /* !defined(MSDOS) */
        !           772:        Return(0);
        !           773:     }
        !           774:     lex = Get();
        !           775:     while (lex.type != LEX_END_OF_FILE) {
        !           776:        UnGet(lex);
        !           777:        /* now, find an entry that is our type. */
        !           778:        GetWS();
        !           779:        oldName = name;
        !           780:        if ((name = GetAlphaMericString()) != 0) {
        !           781:            if (!ustrcmp(name->array, keybdPointer)) {
        !           782:                /* need to make sure there is a name here... */
        !           783:                lex.type = LEX_CHAR;
        !           784:                lex.value = 'a';
        !           785:                UnGet(lex);
        !           786:                Return(1);
        !           787:            }
        !           788:        } else if (GetCharacter('|')) {
        !           789:            ;           /* more names coming */
        !           790:        } else {
        !           791:            lex = Get();
        !           792:            UnGet(lex);
        !           793:            if (lex.type != LEX_END_OF_FILE) {
        !           794:                    if (!GetEntry0()) { /* start of an entry */
        !           795:                        fprintf(stderr,
        !           796:                            "error was in entry for %s in file %s\n",
        !           797:                            (oldName)? oldName->array:"(unknown)", filename);
        !           798:                    Return(0);
        !           799:                }
        !           800:            }
        !           801:        }
        !           802:        lex = Get();
        !           803:     }
        !           804: #if !defined(MSDOS)
        !           805:     fprintf(stderr, "Unable to find entry for %s in file %s\n", keybdPointer,
        !           806:                    filename);
        !           807: #endif /* !defined(MSDOS) */
        !           808:     Return(0);
        !           809: }
        !           810: 
        !           811: char *
        !           812: strsave(string)
        !           813: char *string;
        !           814: {
        !           815:     char *p;
        !           816:     extern char *malloc();
        !           817: 
        !           818:     p = malloc((unsigned int)strlen(string)+1);
        !           819:     if (p != 0) {
        !           820:        strcpy(p, string);
        !           821:     }
        !           822:     return(p);
        !           823: }
        !           824: 
        !           825: 
        !           826: /*
        !           827:  * InitControl - our interface to the outside.  What we should
        !           828:  *  do is figure out keyboard (or terminal) type, set up file pointer
        !           829:  *  (or string pointer), etc.
        !           830:  */
        !           831: 
        !           832: state *
        !           833: InitControl(keybdPointer, pickyarg, translator)
        !           834: char   *keybdPointer;
        !           835: int    pickyarg;               /* Should we be picky? */
        !           836: int    (*translator)();        /* Translates ascii string to integer */
        !           837: {
        !           838:     extern char *getenv();
        !           839:     int GotIt;
        !           840: 
        !           841:     picky = pickyarg;
        !           842:     GetTc = translator;
        !           843: 
        !           844:     if (keybdPointer == 0) {
        !           845:         keybdPointer = getenv("KEYBD");
        !           846:     }
        !           847:     if (keybdPointer == 0) {
        !           848:        keybdPointer = getenv("TERM");
        !           849:     }
        !           850: 
        !           851:                    /*
        !           852:                     * Some environments have getenv() return
        !           853:                     * out of a static area.  So, save the keyboard name.
        !           854:                     */
        !           855:     if (keybdPointer) {
        !           856:         keybdPointer = strsave(keybdPointer);
        !           857:     }
        !           858:     environPointer = getenv("MAP3270");
        !           859:     if (environPointer
        !           860:            && (environPointer[0] != '/')
        !           861: #if    defined(MSDOS)
        !           862:            && (environPointer[0] != '\\')
        !           863: #endif /* defined(MSDOS) */
        !           864:            && (strncmp(keybdPointer, environPointer,
        !           865:                        strlen(keybdPointer) != 0)
        !           866:                || (environPointer[strlen(keybdPointer)] != '{'))) /* } */
        !           867:     {
        !           868:        environPointer = 0;
        !           869:     }
        !           870: 
        !           871:     if ((!environPointer)
        !           872: #if    defined(MSDOS)
        !           873:                || (*environPointer == '\\')
        !           874: #endif /* defined(MSDOS) */
        !           875:                || (*environPointer == '/')) {
        !           876:        usePointer = 0;
        !           877:        GotIt = 0;
        !           878:        if (!keybdPointer) {
        !           879: #if !defined(MSDOS)
        !           880:            fprintf(stderr, "%s%s%s%s",
        !           881:                "Neither the KEYBD environment variable nor the TERM ",
        !           882:                "environment variable\n(one of which is needed to determine ",
        !           883:                "the type of keyboard you are using)\n",
        !           884:                "is set.  To set it, say 'setenv KEYBD <type>'\n");
        !           885: #endif /* !defined(MSDOS) */
        !           886:        } else {
        !           887:            if (environPointer) {
        !           888:                GotIt = Position(environPointer, keybdPointer);
        !           889:            }
        !           890:            if (!GotIt) {
        !           891:                GotIt = Position("/etc/map3270", keybdPointer);
        !           892:            }
        !           893:        }
        !           894:        if (!GotIt) {
        !           895:            if (environPointer) {
        !           896:                GotIt = Position(environPointer, "unknown");
        !           897:            }
        !           898:            if (!GotIt) {
        !           899:                GotIt = Position("/etc/map3270", keybdPointer);
        !           900:            }
        !           901:        }
        !           902:        if (!GotIt) {
        !           903: #if !defined(MSDOS)
        !           904:            fprintf(stderr, "Using default key mappings.\n");
        !           905: #endif /* !defined(MSDOS) */
        !           906:            usePointer = 1;             /* flag use of non-file */
        !           907:            whichkey = keysgeneric;
        !           908:            environPointer = *whichkey; /* use default table */
        !           909:        }
        !           910:     } else {
        !           911:        usePointer = 1;
        !           912:     }
        !           913:     (void) GetEntry();
        !           914:     return(firstentry.address);
        !           915: }

unix.superglobalmegacorp.com

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