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

unix.superglobalmegacorp.com

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