Annotation of 43BSDReno/usr.bin/tn3270/tools/prt3270.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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