Annotation of 43BSD/ucb/tn3270/map3270.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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