Annotation of 43BSDTahoe/ucb/tn3270/tools/prt3270.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: char copyright[] =
        !            15: "@(#) Copyright (c) 1988 Regents of the University of California.\n\
        !            16:  All rights reserved.\n";
        !            17: #endif /* not lint */
        !            18: 
        !            19: #ifndef lint
        !            20: static char sccsid[] = "@(#)prt3270.c  3.3 (Berkeley) 3/28/88";
        !            21: #endif /* not lint */
        !            22: 
        !            23: #if defined(unix)
        !            24: #endif
        !            25: #include <stdio.h>
        !            26: #include <ctype.h>
        !            27: 
        !            28: #include "../general/general.h"
        !            29: 
        !            30: #include "../api/asc_ebc.h"
        !            31: #include "../ctlr/hostctlr.h"
        !            32: #include "../ctlr/screen.h"
        !            33: #include "../ctlr/function.h"
        !            34: #include "../api/astosc.h"
        !            35: #include "../general/globals.h"
        !            36: 
        !            37: #include "../ctlr/kbd.out"
        !            38: 
        !            39: 
        !            40: int NumberColumns = 80;
        !            41: 
        !            42: int direction;
        !            43: 
        !            44: int column = 1;
        !            45: int indenting = 0;
        !            46: int direction = '?';
        !            47: 
        !            48: unsigned char printBuffer[200], *print = printBuffer;
        !            49: 
        !            50: #define        ColsLeft()      (79-column)     /* A little room for error */
        !            51: 
        !            52: 
        !            53: void
        !            54: putSpace()
        !            55: {
        !            56:     extern void Column1();
        !            57:     unsigned char *ourPrint = print;
        !            58: 
        !            59:     print = printBuffer;               /* For mutual calls */
        !            60:     *ourPrint = 0;
        !            61:     if (ColsLeft() < 0) {
        !            62:        Column1();
        !            63:     }
        !            64:     if (column != (indenting*8+1)) {
        !            65:        putchar(' ');
        !            66:     } else {
        !            67:        int i;
        !            68: 
        !            69:        putchar(direction);
        !            70:        putchar(' ');
        !            71:        for (i = 0; i < indenting; i++) {
        !            72:            putchar('\t');
        !            73:        }
        !            74:     }
        !            75:     printf("%s", printBuffer);
        !            76:     column += strlen(printBuffer);
        !            77: }
        !            78: 
        !            79: void
        !            80: Column1()
        !            81: {
        !            82:     if (print != printBuffer) {
        !            83:        putSpace();
        !            84:     }
        !            85:     if (column != (indenting*8+1)) {
        !            86:        putchar('\n');
        !            87:        column = indenting*8+1;
        !            88:     }
        !            89: }
        !            90: 
        !            91: void
        !            92: Indent()
        !            93: {
        !            94:     if ((column != (indenting*8+1)) || (print != printBuffer)) {
        !            95:        Column1();
        !            96:     }
        !            97:     indenting++;
        !            98:     column = indenting*8+1;
        !            99: }
        !           100: 
        !           101: void
        !           102: Undent()
        !           103: {
        !           104:     if ((column != (indenting*8+1)) || (print != printBuffer)) {
        !           105:        Column1();
        !           106:     }
        !           107:     indenting--;
        !           108:     if (indenting < 0) {
        !           109:        fflush(stdout);
        !           110:        fprintf(stderr, "INTERNAL ERROR: indenting < 0.\n");
        !           111:        fflush(stderr);
        !           112:     } else {
        !           113:        column = indenting*8+1;
        !           114:     }
        !           115: }
        !           116: 
        !           117: void
        !           118: putChar(character)
        !           119: int    character;
        !           120: {
        !           121:     *print++ = character;
        !           122:     column++;
        !           123: }
        !           124: 
        !           125: void
        !           126: putstr(s)
        !           127: char *s;
        !           128: {
        !           129:     while (*s) {
        !           130:        putChar(*s++);
        !           131:     }
        !           132: }
        !           133: 
        !           134: void
        !           135: put2hex(i)
        !           136: int i;
        !           137: {
        !           138:     char place[40];
        !           139: 
        !           140:     sprintf(place, "%02x", i);
        !           141:     putstr(place);
        !           142: }
        !           143: 
        !           144: 
        !           145: void
        !           146: putdecimal(i)
        !           147: int i;
        !           148: {
        !           149:     char place[40];
        !           150: 
        !           151:     sprintf(place, "%d", i);
        !           152:     putstr(place);
        !           153: }
        !           154: 
        !           155: void
        !           156: puthex(i)
        !           157: int i;
        !           158: {
        !           159:     char place[40];
        !           160: 
        !           161:     sprintf(place, "%x", i);
        !           162:     putstr(place);
        !           163: }
        !           164: 
        !           165: void
        !           166: putEChar(character)
        !           167: int character;
        !           168: {
        !           169:     putChar(ebc_asc[character]);
        !           170:     if (ColsLeft() < 10) {
        !           171:        Column1();
        !           172:     }
        !           173: }
        !           174: 
        !           175: void
        !           176: PrintAid(i)
        !           177: int    i;
        !           178: {
        !           179:     struct astosc *this;
        !           180: 
        !           181:     for (this = &astosc[0]; this <= &astosc[highestof(astosc)]; this++) {
        !           182:        if (this->function == FCN_AID) {
        !           183:            int j;
        !           184: 
        !           185:            switch (this->shiftstate) {
        !           186:            case 0:
        !           187:                j = 0;
        !           188:                break;
        !           189:            case SHIFT_UPSHIFT:
        !           190:                j = 1;
        !           191:                break;
        !           192:            case SHIFT_ALT:
        !           193:                j = 2;
        !           194:                break;
        !           195:            case (SHIFT_UPSHIFT|SHIFT_ALT):
        !           196:                j = 3;
        !           197:                break;
        !           198:            default:
        !           199:                fprintf(stderr, "Bad shiftstate 0x%x.\n", this->shiftstate);
        !           200:                exit(1);
        !           201:            }
        !           202:            if (hits[this->scancode].hit[j].code == i) {
        !           203:                putstr(this->name);
        !           204:                return;
        !           205:            }
        !           206:        }
        !           207:     }
        !           208: 
        !           209:     putstr("Unknown AID 0x");
        !           210:     put2hex(i);
        !           211: }
        !           212: 
        !           213: void
        !           214: PrintAddr(i)
        !           215: int    i;
        !           216: {
        !           217:     if (ColsLeft() < 9) {
        !           218:        Column1();
        !           219:     }
        !           220:     putChar('(');
        !           221:     putdecimal(ScreenLine(i));
        !           222:     putChar(',');
        !           223:     putdecimal(ScreenLineOffset(i));
        !           224:     putChar(')');
        !           225: }
        !           226: 
        !           227: 
        !           228: /* returns the number of characters consumed */
        !           229: int
        !           230: DataFromNetwork(buffer, count, control)
        !           231: register unsigned char *buffer;                /* what the data is */
        !           232: register int   count;                          /* and how much there is */
        !           233: int    control;                                /* this buffer ended block? */
        !           234: {
        !           235:     int origCount;
        !           236:     register int c;
        !           237:     register int i;
        !           238:     static int Command;
        !           239:     static int Wcc;
        !           240:     static int LastWasTerminated = 1;  /* was "control" = 1 last time? */
        !           241: 
        !           242:     if (count == 0) {
        !           243:        Column1();
        !           244:        return 0;
        !           245:     }
        !           246: 
        !           247:     origCount = count;
        !           248: 
        !           249:     if (LastWasTerminated) {
        !           250: 
        !           251:        if (count < 2) {
        !           252:            if (count == 0) {
        !           253:                fflush(stdout);
        !           254:                fprintf(stderr, "Short count received from host!\n");
        !           255:                fflush(stderr);
        !           256:                return(count);
        !           257:            }
        !           258:            Command = buffer[0];
        !           259:            switch (Command) {          /* This had better be a read command */
        !           260:            case CMD_READ_MODIFIED:
        !           261:                putstr("read_modified command\n");
        !           262:                break;
        !           263:            case CMD_SNA_READ_MODIFIED:
        !           264:                putstr("sna_read_modified command\n");
        !           265:                break;
        !           266:            case CMD_SNA_READ_MODIFIED_ALL:
        !           267:                putstr("sna_read_modified_all command\n");
        !           268:                break;
        !           269:            case CMD_READ_BUFFER:
        !           270:                putstr("read_buffer command\n");
        !           271:                break;
        !           272:            case CMD_SNA_READ_BUFFER:
        !           273:                putstr("sna_read_buffer command\n");
        !           274:                break;
        !           275:            default:
        !           276:                break;
        !           277:            }
        !           278:            return(1);                  /* We consumed everything */
        !           279:        }
        !           280:        Command = buffer[0];
        !           281:        Wcc = buffer[1];
        !           282:        switch (Command) {
        !           283:        case CMD_ERASE_WRITE:
        !           284:            putstr("erase write command ");
        !           285:            break;
        !           286:        case CMD_ERASE_WRITE_ALTERNATE:
        !           287:            putstr("erase write alternate command ");
        !           288:            break;
        !           289:        case CMD_SNA_ERASE_WRITE:
        !           290:            putstr("sna erase write command ");
        !           291:            break;
        !           292:        case CMD_SNA_ERASE_WRITE_ALTERNATE:
        !           293:            putstr("erase write alternate command ");
        !           294:            break;
        !           295:        case CMD_ERASE_ALL_UNPROTECTED:
        !           296:            putstr("erase all unprotected command ");
        !           297:            break;
        !           298:        case CMD_SNA_ERASE_ALL_UNPROTECTED:
        !           299:            putstr("sna erase write command ");
        !           300:            break;
        !           301:        case CMD_WRITE:
        !           302:            putstr("write command ");
        !           303:            break;
        !           304:        case CMD_SNA_WRITE:
        !           305:            putstr("sna write command ");
        !           306:            break;
        !           307:        default:
        !           308:            putstr("Unexpected command code 0x");
        !           309:            puthex(Command);
        !           310:            putstr(" received.");
        !           311:            Column1();
        !           312:            break;
        !           313:        }
        !           314:        putstr("WCC is 0x");
        !           315:        puthex(Wcc);
        !           316:        Column1();
        !           317: 
        !           318:        count -= 2;                     /* strip off command and wcc */
        !           319:        buffer += 2;
        !           320: 
        !           321:     }
        !           322:     LastWasTerminated = 0;             /* then, reset at end... */
        !           323: 
        !           324:     while (count) {
        !           325:        count--;
        !           326:        c = *buffer++;
        !           327:        if (IsOrder(c)) {
        !           328:            /* handle an order */
        !           329:            switch (c) {
        !           330: #              define Ensure(x)        if (count < x) { \
        !           331:                                            if (!control) { \
        !           332:                                                return(origCount-(count+1)); \
        !           333:                                            } else { \
        !           334:                                                /* XXX - should not occur */ \
        !           335:                                                count = 0; \
        !           336:                                                break; \
        !           337:                                            } \
        !           338:                                        }
        !           339:            case ORDER_SF:
        !           340:                Ensure(1);
        !           341:                c = *buffer++;
        !           342:                count--;
        !           343:                putstr("SF (0x");
        !           344:                put2hex(c);
        !           345:                putstr(") ");
        !           346:                break;
        !           347:            case ORDER_SBA:
        !           348:                Ensure(2);
        !           349:                i = buffer[0];
        !           350:                c = buffer[1];
        !           351:                buffer += 2;
        !           352:                count -= 2;
        !           353:                putstr("SBA to ");
        !           354:                PrintAddr(Addr3270(i,c));
        !           355:                putSpace();
        !           356:                break;
        !           357:            case ORDER_IC:
        !           358:                putstr("IC");
        !           359:                putSpace();
        !           360:                break;
        !           361:            case ORDER_PT:
        !           362:                putstr("PT");
        !           363:                putSpace();
        !           364:                break;
        !           365:            case ORDER_RA:
        !           366:                Ensure(3);
        !           367:                i = Addr3270(buffer[0], buffer[1]);
        !           368:                c = buffer[2];
        !           369:                buffer += 3;
        !           370:                count -= 3;
        !           371:                putstr("RA to ");
        !           372:                PrintAddr(i);
        !           373:                putstr(" of 0x");
        !           374:                put2hex(c);
        !           375:                putSpace();
        !           376:                break;
        !           377:            case ORDER_EUA:    /* (from [here,there), ie: half open interval] */
        !           378:                Ensure(2);
        !           379:                putstr("EUA to ");
        !           380:                PrintAddr(Addr3270(buffer[0], buffer[1]));
        !           381:                putSpace();
        !           382:                buffer += 2;
        !           383:                count -= 2;
        !           384:                break;
        !           385:            case ORDER_YALE:            /* special YALE defined order */
        !           386:                Ensure(2);      /* need at least two characters */
        !           387:                putstr("YALE order");
        !           388:                putSpace();
        !           389:                break;
        !           390:            default:
        !           391:                putstr("UNKNOWN ORDER: 0x");
        !           392:                put2hex(c);
        !           393:                putSpace();
        !           394:                break;
        !           395:            }
        !           396:            if (count < 0) {
        !           397:                count = 0;
        !           398:            }
        !           399:        } else {
        !           400:            /* Data comes in large clumps - take it all */
        !           401:            putstr("DATA:");
        !           402:            Indent();
        !           403:            putEChar(c);
        !           404:            c = *buffer;
        !           405:            while (count && !IsOrder(c)) {
        !           406:                putEChar(c);
        !           407:                count--;
        !           408:                buffer++;
        !           409:                c = *buffer;
        !           410:            }
        !           411:            Undent();
        !           412:        }
        !           413:     }
        !           414:     LastWasTerminated = control;
        !           415:     return origCount - count;
        !           416: }
        !           417: 
        !           418: int
        !           419: DataToNetwork(buffer, count, control)
        !           420: unsigned char *buffer;
        !           421: int count;
        !           422: int control;
        !           423: {
        !           424: #define        NEED_AID        0
        !           425: #define        JUST_GOT_AID    1
        !           426: #define        DATA            2
        !           427: #define        DATA_CONTINUE   3
        !           428:     static int state = NEED_AID;
        !           429:     static int aid;
        !           430:     int origCount = count;
        !           431: 
        !           432:     if (count == 0) {
        !           433:        if (control) {
        !           434:            state = NEED_AID;
        !           435:        }
        !           436:        Column1();
        !           437:        return 0;
        !           438:     }
        !           439: 
        !           440:     switch (state) {
        !           441:     case NEED_AID:
        !           442:        aid = buffer[0];
        !           443:        buffer++;
        !           444:        count--;
        !           445:        PrintAid(aid);
        !           446:        putSpace();
        !           447:        if (aid == AID_TREQ) {
        !           448:            state = DATA;
        !           449:        } else {
        !           450:            state = JUST_GOT_AID;
        !           451:        }
        !           452:        return origCount - count + DataToNetwork(buffer, count, control);
        !           453:     case JUST_GOT_AID:
        !           454:        Ensure(2);
        !           455:        PrintAddr(Addr3270(buffer[0], buffer[1]));
        !           456:        putSpace();
        !           457:        buffer += 2;
        !           458:        count -= 2;
        !           459:        state = DATA;
        !           460:        return origCount - count + DataToNetwork(buffer, count, control);
        !           461:     case DATA:
        !           462:     case DATA_CONTINUE:
        !           463:        while (count) {
        !           464:            if (*buffer == ORDER_SBA) {
        !           465:                if (state == DATA_CONTINUE) {
        !           466:                    Undent();
        !           467:                    state = DATA;
        !           468:                }
        !           469:                putstr("SBA ");
        !           470:                PrintAddr(Addr3270(buffer[1], buffer[2]));
        !           471:                putSpace();
        !           472:                buffer += 3;
        !           473:                count -= 3;
        !           474:            } else {
        !           475:                if (state == DATA) {
        !           476:                    putstr("DATA:");
        !           477:                    Indent();
        !           478:                    state = DATA_CONTINUE;
        !           479:                }
        !           480:                putEChar(*buffer);
        !           481:                buffer++;
        !           482:                count--;
        !           483:            }
        !           484:        }
        !           485:        if (control) {
        !           486:            if (state == DATA_CONTINUE) {
        !           487:                Undent();
        !           488:            }
        !           489:            state = NEED_AID;
        !           490:        }
        !           491:        return origCount-count;
        !           492:     }
        !           493: }
        !           494: 
        !           495: int
        !           496: GetXValue(c)
        !           497: int    c;
        !           498: {
        !           499:     if (!isascii(c)) {
        !           500:        fflush(stdout);
        !           501:        fprintf(stderr, "Non-hex digit 0x%x.\n");
        !           502:        fflush(stderr);
        !           503:        return 0;
        !           504:     } else {
        !           505:        if (islower(c)) {
        !           506:            return (c-'a')+10;
        !           507:        } else if (isupper(c)) {
        !           508:            return (c-'A')+10;
        !           509:        } else {
        !           510:            return c-'0';
        !           511:        }
        !           512:     }
        !           513: }
        !           514: 
        !           515: unsigned char outbound[8192], inbound[8192],
        !           516:        *outnext = outbound, *innext = inbound, *p = 0;
        !           517: 
        !           518: void
        !           519: termblock(old, new, control)
        !           520: int old,
        !           521:        new;            /* old and new directions */
        !           522: {
        !           523:     int count;
        !           524: 
        !           525:     if (p) {
        !           526:        if (old == '<') {
        !           527:            outnext = p;
        !           528:            count = DataFromNetwork(outbound, outnext-outbound, control);
        !           529:            if (outbound+count == outnext) {
        !           530:                outnext = outbound;
        !           531:            } else {
        !           532:                memcpy(outbound, outbound+count, outnext-(outbound+count));
        !           533:                outnext = outbound+count;
        !           534:            }
        !           535:        } else {
        !           536:            innext = p;
        !           537:            count = DataToNetwork(inbound, innext-inbound, control);
        !           538:            if (inbound+count == innext) {
        !           539:                innext = inbound;
        !           540:            } else {
        !           541:                memcpy(inbound, inbound+count, innext-(inbound+count));
        !           542:                innext = inbound+count;
        !           543:            }
        !           544:        }
        !           545:     }
        !           546:     if (new == '<') {
        !           547:        p = outnext;
        !           548:     } else if (new == '>') {
        !           549:        p = innext;
        !           550:     } else {
        !           551:        fprintf(stderr, "Bad direction character '%c'.\n", new);
        !           552:        exit(1);
        !           553:     }
        !           554: }
        !           555: 
        !           556: main()
        !           557: {
        !           558:     int location;
        !           559:     char new;
        !           560:     int c, c1;
        !           561: 
        !           562:     memset(Orders, 0, sizeof Orders);
        !           563:     Orders[ORDER_SF] = Orders[ORDER_SBA] = Orders[ORDER_IC]
        !           564:            = Orders[ORDER_PT] = Orders[ORDER_RA] = Orders[ORDER_EUA]
        !           565:            = Orders[ORDER_YALE] = 1;
        !           566: 
        !           567:     while (scanf("%c 0x%x\t", &new, &location) != EOF) {
        !           568:        if (new != direction) {
        !           569:            termblock(direction, new, 0);
        !           570:            direction = new;
        !           571:        }
        !           572:        while (((c = getchar()) != EOF) && (c != '\n') && (isxdigit(c))) {
        !           573: #define        NORMAL  0
        !           574: #define        GOT0XFF 0xff
        !           575:            static int state = NORMAL;
        !           576: 
        !           577:            c1 = getchar();
        !           578:            c = (GetXValue(c) << 4) + GetXValue(c1);
        !           579:            switch (state) {
        !           580:            case NORMAL:
        !           581:                if (c == 0xff) {
        !           582:                    state = GOT0XFF;
        !           583:                } else {
        !           584:                    *p++ = c;
        !           585:                }
        !           586:                break;
        !           587:            case GOT0XFF:
        !           588:                if (c == 0xef) {
        !           589:                    termblock(direction, direction, 1);
        !           590:                } else {
        !           591:                    *p++ = 0xff;
        !           592:                    *p++ = c;
        !           593:                }
        !           594:                state = NORMAL;
        !           595:            }
        !           596:        }
        !           597:     }
        !           598:     return 0;
        !           599: }

unix.superglobalmegacorp.com

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