148763Sbostic /*-
2*62363Sbostic * Copyright (c) 1988, 1993
3*62363Sbostic * The Regents of the University of California. All rights reserved.
431896Sminshall *
548763Sbostic * %sccs.include.redist.c%
631896Sminshall */
730051Sminshall
831896Sminshall #ifndef lint
9*62363Sbostic static char copyright[] =
10*62363Sbostic "@(#) Copyright (c) 1988, 1993\n\
11*62363Sbostic The Regents of the University of California. All rights reserved.\n";
1233811Sbostic #endif /* not lint */
1330051Sminshall
1433811Sbostic #ifndef lint
15*62363Sbostic static char sccsid[] = "@(#)prt3270.c 8.1 (Berkeley) 06/06/93";
1633811Sbostic #endif /* not lint */
1733811Sbostic
1830051Sminshall #if defined(unix)
1930051Sminshall #endif
2030051Sminshall #include <stdio.h>
2130051Sminshall #include <ctype.h>
2230051Sminshall
2331175Sminshall #include "../general/general.h"
2431102Sminshall
2531875Sminshall #include "../api/asc_ebc.h"
2630051Sminshall #include "../ctlr/hostctlr.h"
2730051Sminshall #include "../ctlr/screen.h"
2831444Sminshall #include "../ctlr/function.h"
2931875Sminshall #include "../api/astosc.h"
3031175Sminshall #include "../general/globals.h"
3130051Sminshall
3231444Sminshall #include "../ctlr/kbd.out"
3330051Sminshall
3431444Sminshall
3530051Sminshall int NumberColumns = 80;
3630051Sminshall
3730051Sminshall int direction;
3830051Sminshall
3930051Sminshall int column = 1;
4030051Sminshall int indenting = 0;
4130051Sminshall int direction = '?';
4230051Sminshall
4330051Sminshall unsigned char printBuffer[200], *print = printBuffer;
4430051Sminshall
4530051Sminshall #define ColsLeft() (79-column) /* A little room for error */
4630051Sminshall
4730051Sminshall
4830051Sminshall void
putSpace()4930051Sminshall putSpace()
5030051Sminshall {
5130051Sminshall extern void Column1();
5230051Sminshall unsigned char *ourPrint = print;
5330051Sminshall
5430051Sminshall print = printBuffer; /* For mutual calls */
5530051Sminshall *ourPrint = 0;
5630051Sminshall if (ColsLeft() < 0) {
5730051Sminshall Column1();
5830051Sminshall }
5930051Sminshall if (column != (indenting*8+1)) {
6030051Sminshall putchar(' ');
6130051Sminshall } else {
6230051Sminshall int i;
6330051Sminshall
6430051Sminshall putchar(direction);
6530051Sminshall putchar(' ');
6630051Sminshall for (i = 0; i < indenting; i++) {
6730051Sminshall putchar('\t');
6830051Sminshall }
6930051Sminshall }
7030051Sminshall printf("%s", printBuffer);
7130051Sminshall column += strlen(printBuffer);
7230051Sminshall }
7330051Sminshall
7430051Sminshall void
Column1()7530051Sminshall Column1()
7630051Sminshall {
7730051Sminshall if (print != printBuffer) {
7830051Sminshall putSpace();
7930051Sminshall }
8030051Sminshall if (column != (indenting*8+1)) {
8130051Sminshall putchar('\n');
8230051Sminshall column = indenting*8+1;
8330051Sminshall }
8430051Sminshall }
8530051Sminshall
8630051Sminshall void
Indent()8730051Sminshall Indent()
8830051Sminshall {
8930051Sminshall if ((column != (indenting*8+1)) || (print != printBuffer)) {
9030051Sminshall Column1();
9130051Sminshall }
9230051Sminshall indenting++;
9330051Sminshall column = indenting*8+1;
9430051Sminshall }
9530051Sminshall
9630051Sminshall void
Undent()9730051Sminshall Undent()
9830051Sminshall {
9930051Sminshall if ((column != (indenting*8+1)) || (print != printBuffer)) {
10030051Sminshall Column1();
10130051Sminshall }
10230051Sminshall indenting--;
10330051Sminshall if (indenting < 0) {
10430051Sminshall fflush(stdout);
10530051Sminshall fprintf(stderr, "INTERNAL ERROR: indenting < 0.\n");
10630051Sminshall fflush(stderr);
10730051Sminshall } else {
10830051Sminshall column = indenting*8+1;
10930051Sminshall }
11030051Sminshall }
11130051Sminshall
11230051Sminshall void
putChar(character)11330051Sminshall putChar(character)
11430051Sminshall int character;
11530051Sminshall {
11630051Sminshall *print++ = character;
11730732Sminshall column++;
11830051Sminshall }
11930051Sminshall
12030051Sminshall void
putstr(s)12130051Sminshall putstr(s)
12230051Sminshall char *s;
12330051Sminshall {
12430051Sminshall while (*s) {
12530051Sminshall putChar(*s++);
12630051Sminshall }
12730051Sminshall }
12830051Sminshall
12930051Sminshall void
put2hex(i)13030051Sminshall put2hex(i)
13130051Sminshall int i;
13230051Sminshall {
13330051Sminshall char place[40];
13430051Sminshall
13530051Sminshall sprintf(place, "%02x", i);
13630051Sminshall putstr(place);
13730051Sminshall }
13830051Sminshall
13930051Sminshall
14030051Sminshall void
putdecimal(i)14130051Sminshall putdecimal(i)
14230051Sminshall int i;
14330051Sminshall {
14430051Sminshall char place[40];
14530051Sminshall
14630051Sminshall sprintf(place, "%d", i);
14730051Sminshall putstr(place);
14830051Sminshall }
14930051Sminshall
15030051Sminshall void
puthex(i)15130051Sminshall puthex(i)
15230051Sminshall int i;
15330051Sminshall {
15430051Sminshall char place[40];
15530051Sminshall
15630051Sminshall sprintf(place, "%x", i);
15730051Sminshall putstr(place);
15830051Sminshall }
15930051Sminshall
16030051Sminshall void
putEChar(character)16130051Sminshall putEChar(character)
16230051Sminshall int character;
16330051Sminshall {
16431614Sminshall putChar(ebc_asc[character]);
16530051Sminshall if (ColsLeft() < 10) {
16630051Sminshall Column1();
16730051Sminshall }
16830051Sminshall }
16930051Sminshall
17030051Sminshall void
PrintAid(i)17130051Sminshall PrintAid(i)
17230051Sminshall int i;
17330051Sminshall {
17431444Sminshall struct astosc *this;
17530051Sminshall
17631444Sminshall for (this = &astosc[0]; this <= &astosc[highestof(astosc)]; this++) {
17731444Sminshall if (this->function == FCN_AID) {
17831444Sminshall int j;
17931444Sminshall
18031444Sminshall switch (this->shiftstate) {
18131444Sminshall case 0:
18231444Sminshall j = 0;
18331444Sminshall break;
18431444Sminshall case SHIFT_UPSHIFT:
18531444Sminshall j = 1;
18631444Sminshall break;
18731444Sminshall case SHIFT_ALT:
18831444Sminshall j = 2;
18931444Sminshall break;
19031444Sminshall case (SHIFT_UPSHIFT|SHIFT_ALT):
19131444Sminshall j = 3;
19231444Sminshall break;
19331444Sminshall default:
19431444Sminshall fprintf(stderr, "Bad shiftstate 0x%x.\n", this->shiftstate);
19531444Sminshall exit(1);
19631444Sminshall }
19731444Sminshall if (hits[this->scancode].hit[j].code == i) {
19831444Sminshall putstr(this->name);
19931444Sminshall return;
20031444Sminshall }
20130051Sminshall }
20230051Sminshall }
20330051Sminshall
20430051Sminshall putstr("Unknown AID 0x");
20530051Sminshall put2hex(i);
20630051Sminshall }
20730051Sminshall
20830051Sminshall void
PrintAddr(i)20930051Sminshall PrintAddr(i)
21030051Sminshall int i;
21130051Sminshall {
21230051Sminshall if (ColsLeft() < 9) {
21330051Sminshall Column1();
21430051Sminshall }
21530051Sminshall putChar('(');
21630051Sminshall putdecimal(ScreenLine(i));
21730051Sminshall putChar(',');
21830051Sminshall putdecimal(ScreenLineOffset(i));
21930051Sminshall putChar(')');
22030051Sminshall }
22130051Sminshall
22230051Sminshall
22330051Sminshall /* returns the number of characters consumed */
22430051Sminshall int
DataFromNetwork(buffer,count,control)22530051Sminshall DataFromNetwork(buffer, count, control)
22630051Sminshall register unsigned char *buffer; /* what the data is */
22730051Sminshall register int count; /* and how much there is */
22830051Sminshall int control; /* this buffer ended block? */
22930051Sminshall {
23030051Sminshall int origCount;
23130051Sminshall register int c;
23230051Sminshall register int i;
23330051Sminshall static int Command;
23430051Sminshall static int Wcc;
23530051Sminshall static int LastWasTerminated = 1; /* was "control" = 1 last time? */
23630051Sminshall
23730051Sminshall if (count == 0) {
23830051Sminshall Column1();
23930051Sminshall return 0;
24030051Sminshall }
24130051Sminshall
24230051Sminshall origCount = count;
24330051Sminshall
24430051Sminshall if (LastWasTerminated) {
24530051Sminshall
24630051Sminshall if (count < 2) {
24730051Sminshall if (count == 0) {
24830051Sminshall fflush(stdout);
24930051Sminshall fprintf(stderr, "Short count received from host!\n");
25030051Sminshall fflush(stderr);
25130051Sminshall return(count);
25230051Sminshall }
25330051Sminshall Command = buffer[0];
25430051Sminshall switch (Command) { /* This had better be a read command */
25530051Sminshall case CMD_READ_MODIFIED:
25630051Sminshall putstr("read_modified command\n");
25730051Sminshall break;
25830051Sminshall case CMD_SNA_READ_MODIFIED:
25932090Sminshall putstr("sna_read_modified command\n");
26030051Sminshall break;
26130051Sminshall case CMD_SNA_READ_MODIFIED_ALL:
26232090Sminshall putstr("sna_read_modified_all command\n");
26330051Sminshall break;
26430051Sminshall case CMD_READ_BUFFER:
26532090Sminshall putstr("read_buffer command\n");
26630051Sminshall break;
26730051Sminshall case CMD_SNA_READ_BUFFER:
26832090Sminshall putstr("sna_read_buffer command\n");
26930051Sminshall break;
27030051Sminshall default:
27130051Sminshall break;
27230051Sminshall }
27330051Sminshall return(1); /* We consumed everything */
27430051Sminshall }
27530051Sminshall Command = buffer[0];
27630051Sminshall Wcc = buffer[1];
27730051Sminshall switch (Command) {
27830051Sminshall case CMD_ERASE_WRITE:
27930051Sminshall putstr("erase write command ");
28030051Sminshall break;
28130051Sminshall case CMD_ERASE_WRITE_ALTERNATE:
28230051Sminshall putstr("erase write alternate command ");
28330051Sminshall break;
28430051Sminshall case CMD_SNA_ERASE_WRITE:
28530051Sminshall putstr("sna erase write command ");
28630051Sminshall break;
28730051Sminshall case CMD_SNA_ERASE_WRITE_ALTERNATE:
28830051Sminshall putstr("erase write alternate command ");
28930051Sminshall break;
29030051Sminshall case CMD_ERASE_ALL_UNPROTECTED:
29130051Sminshall putstr("erase all unprotected command ");
29230051Sminshall break;
29330051Sminshall case CMD_SNA_ERASE_ALL_UNPROTECTED:
29430051Sminshall putstr("sna erase write command ");
29530051Sminshall break;
29630051Sminshall case CMD_WRITE:
29730051Sminshall putstr("write command ");
29830051Sminshall break;
29930051Sminshall case CMD_SNA_WRITE:
30030051Sminshall putstr("sna write command ");
30130051Sminshall break;
30230051Sminshall default:
30330051Sminshall putstr("Unexpected command code 0x");
30430051Sminshall puthex(Command);
30530051Sminshall putstr(" received.");
30630051Sminshall Column1();
30730051Sminshall break;
30830051Sminshall }
30930051Sminshall putstr("WCC is 0x");
31030051Sminshall puthex(Wcc);
31130051Sminshall Column1();
31230051Sminshall
31330051Sminshall count -= 2; /* strip off command and wcc */
31430051Sminshall buffer += 2;
31530051Sminshall
31630051Sminshall }
31730051Sminshall LastWasTerminated = 0; /* then, reset at end... */
31830051Sminshall
31930051Sminshall while (count) {
32030051Sminshall count--;
32130051Sminshall c = *buffer++;
32230051Sminshall if (IsOrder(c)) {
32330051Sminshall /* handle an order */
32430051Sminshall switch (c) {
32530051Sminshall # define Ensure(x) if (count < x) { \
32630051Sminshall if (!control) { \
32730051Sminshall return(origCount-(count+1)); \
32830051Sminshall } else { \
32930051Sminshall /* XXX - should not occur */ \
33030051Sminshall count = 0; \
33130051Sminshall break; \
33230051Sminshall } \
33330051Sminshall }
33430051Sminshall case ORDER_SF:
33530051Sminshall Ensure(1);
33630051Sminshall c = *buffer++;
33730051Sminshall count--;
33830051Sminshall putstr("SF (0x");
33930051Sminshall put2hex(c);
34030051Sminshall putstr(") ");
34130051Sminshall break;
34230051Sminshall case ORDER_SBA:
34330051Sminshall Ensure(2);
34430051Sminshall i = buffer[0];
34530051Sminshall c = buffer[1];
34630051Sminshall buffer += 2;
34730051Sminshall count -= 2;
34830051Sminshall putstr("SBA to ");
34930051Sminshall PrintAddr(Addr3270(i,c));
35030051Sminshall putSpace();
35130051Sminshall break;
35230051Sminshall case ORDER_IC:
35330051Sminshall putstr("IC");
35430051Sminshall putSpace();
35530051Sminshall break;
35630051Sminshall case ORDER_PT:
35730051Sminshall putstr("PT");
35830051Sminshall putSpace();
35930051Sminshall break;
36030051Sminshall case ORDER_RA:
36130051Sminshall Ensure(3);
36230051Sminshall i = Addr3270(buffer[0], buffer[1]);
36330051Sminshall c = buffer[2];
36430051Sminshall buffer += 3;
36530051Sminshall count -= 3;
36630051Sminshall putstr("RA to ");
36730051Sminshall PrintAddr(i);
36830051Sminshall putstr(" of 0x");
36930051Sminshall put2hex(c);
37030051Sminshall putSpace();
37130051Sminshall break;
37230051Sminshall case ORDER_EUA: /* (from [here,there), ie: half open interval] */
37330051Sminshall Ensure(2);
37430051Sminshall putstr("EUA to ");
37530051Sminshall PrintAddr(Addr3270(buffer[0], buffer[1]));
37630051Sminshall putSpace();
37730051Sminshall buffer += 2;
37830051Sminshall count -= 2;
37930051Sminshall break;
38030051Sminshall case ORDER_YALE: /* special YALE defined order */
38130051Sminshall Ensure(2); /* need at least two characters */
38230051Sminshall putstr("YALE order");
38330051Sminshall putSpace();
38430051Sminshall break;
38530051Sminshall default:
38630051Sminshall putstr("UNKNOWN ORDER: 0x");
38730051Sminshall put2hex(c);
38830051Sminshall putSpace();
38930051Sminshall break;
39030051Sminshall }
39130051Sminshall if (count < 0) {
39230051Sminshall count = 0;
39330051Sminshall }
39430051Sminshall } else {
39530051Sminshall /* Data comes in large clumps - take it all */
39630051Sminshall putstr("DATA:");
39730051Sminshall Indent();
39830051Sminshall putEChar(c);
39930051Sminshall c = *buffer;
40030051Sminshall while (count && !IsOrder(c)) {
40130051Sminshall putEChar(c);
40230051Sminshall count--;
40330051Sminshall buffer++;
40430051Sminshall c = *buffer;
40530051Sminshall }
40630051Sminshall Undent();
40730051Sminshall }
40830051Sminshall }
40930051Sminshall LastWasTerminated = control;
41030051Sminshall return origCount - count;
41130051Sminshall }
41230051Sminshall
41330051Sminshall int
DataToNetwork(buffer,count,control)41430051Sminshall DataToNetwork(buffer, count, control)
41530051Sminshall unsigned char *buffer;
41630051Sminshall int count;
41730051Sminshall int control;
41830051Sminshall {
41930051Sminshall #define NEED_AID 0
42030051Sminshall #define JUST_GOT_AID 1
42130051Sminshall #define DATA 2
42230051Sminshall #define DATA_CONTINUE 3
42330051Sminshall static int state = NEED_AID;
42430051Sminshall static int aid;
42530051Sminshall int origCount = count;
42630051Sminshall
42730051Sminshall if (count == 0) {
42830051Sminshall if (control) {
42930051Sminshall state = NEED_AID;
43030051Sminshall }
43130051Sminshall Column1();
43230051Sminshall return 0;
43330051Sminshall }
43430051Sminshall
43530051Sminshall switch (state) {
43630051Sminshall case NEED_AID:
43730051Sminshall aid = buffer[0];
43830051Sminshall buffer++;
43930051Sminshall count--;
44030051Sminshall PrintAid(aid);
44130051Sminshall putSpace();
44231444Sminshall if (aid == AID_TREQ) {
44330051Sminshall state = DATA;
44430051Sminshall } else {
44530051Sminshall state = JUST_GOT_AID;
44630051Sminshall }
44730051Sminshall return origCount - count + DataToNetwork(buffer, count, control);
44830051Sminshall case JUST_GOT_AID:
44930051Sminshall Ensure(2);
45030051Sminshall PrintAddr(Addr3270(buffer[0], buffer[1]));
45130051Sminshall putSpace();
45230051Sminshall buffer += 2;
45330051Sminshall count -= 2;
45430051Sminshall state = DATA;
45530051Sminshall return origCount - count + DataToNetwork(buffer, count, control);
45630051Sminshall case DATA:
45730051Sminshall case DATA_CONTINUE:
45830051Sminshall while (count) {
45930051Sminshall if (*buffer == ORDER_SBA) {
46030051Sminshall if (state == DATA_CONTINUE) {
46130051Sminshall Undent();
46230051Sminshall state = DATA;
46330051Sminshall }
46430051Sminshall putstr("SBA ");
46530051Sminshall PrintAddr(Addr3270(buffer[1], buffer[2]));
46630051Sminshall putSpace();
46730051Sminshall buffer += 3;
46830051Sminshall count -= 3;
46930051Sminshall } else {
47030051Sminshall if (state == DATA) {
47130051Sminshall putstr("DATA:");
47230051Sminshall Indent();
47330051Sminshall state = DATA_CONTINUE;
47430051Sminshall }
47530051Sminshall putEChar(*buffer);
47630051Sminshall buffer++;
47730051Sminshall count--;
47830051Sminshall }
47930051Sminshall }
48030051Sminshall if (control) {
48130051Sminshall if (state == DATA_CONTINUE) {
48230051Sminshall Undent();
48330051Sminshall }
48430051Sminshall state = NEED_AID;
48530051Sminshall }
48630051Sminshall return origCount-count;
48730051Sminshall }
48830051Sminshall }
48930051Sminshall
49030051Sminshall int
GetXValue(c)49130051Sminshall GetXValue(c)
49230051Sminshall int c;
49330051Sminshall {
49430051Sminshall if (!isascii(c)) {
49530051Sminshall fflush(stdout);
49630051Sminshall fprintf(stderr, "Non-hex digit 0x%x.\n");
49730051Sminshall fflush(stderr);
49830051Sminshall return 0;
49930051Sminshall } else {
50030051Sminshall if (islower(c)) {
50130051Sminshall return (c-'a')+10;
50230051Sminshall } else if (isupper(c)) {
50330051Sminshall return (c-'A')+10;
50430051Sminshall } else {
50530051Sminshall return c-'0';
50630051Sminshall }
50730051Sminshall }
50830051Sminshall }
50930051Sminshall
51030051Sminshall unsigned char outbound[8192], inbound[8192],
51130051Sminshall *outnext = outbound, *innext = inbound, *p = 0;
51230051Sminshall
51330051Sminshall void
termblock(old,new,control)51430051Sminshall termblock(old, new, control)
51530051Sminshall int old,
51630051Sminshall new; /* old and new directions */
51730051Sminshall {
51830051Sminshall int count;
51930051Sminshall
52030051Sminshall if (p) {
52130051Sminshall if (old == '<') {
52230051Sminshall outnext = p;
52330051Sminshall count = DataFromNetwork(outbound, outnext-outbound, control);
52430051Sminshall if (outbound+count == outnext) {
52530051Sminshall outnext = outbound;
52630051Sminshall } else {
52731102Sminshall memcpy(outbound, outbound+count, outnext-(outbound+count));
52830051Sminshall outnext = outbound+count;
52930051Sminshall }
53030051Sminshall } else {
53130051Sminshall innext = p;
53230051Sminshall count = DataToNetwork(inbound, innext-inbound, control);
53330051Sminshall if (inbound+count == innext) {
53430051Sminshall innext = inbound;
53530051Sminshall } else {
53631102Sminshall memcpy(inbound, inbound+count, innext-(inbound+count));
53730051Sminshall innext = inbound+count;
53830051Sminshall }
53930051Sminshall }
54030051Sminshall }
54130051Sminshall if (new == '<') {
54230051Sminshall p = outnext;
54330051Sminshall } else if (new == '>') {
54430051Sminshall p = innext;
54530051Sminshall } else {
54630051Sminshall fprintf(stderr, "Bad direction character '%c'.\n", new);
54730051Sminshall exit(1);
54830051Sminshall }
54930051Sminshall }
55030051Sminshall
main()55130051Sminshall main()
55230051Sminshall {
55330051Sminshall int location;
55432090Sminshall char new;
55530051Sminshall int c, c1;
55630051Sminshall
55731102Sminshall memset(Orders, 0, sizeof Orders);
55830051Sminshall Orders[ORDER_SF] = Orders[ORDER_SBA] = Orders[ORDER_IC]
55930051Sminshall = Orders[ORDER_PT] = Orders[ORDER_RA] = Orders[ORDER_EUA]
56030051Sminshall = Orders[ORDER_YALE] = 1;
56130051Sminshall
56230051Sminshall while (scanf("%c 0x%x\t", &new, &location) != EOF) {
56330051Sminshall if (new != direction) {
56430051Sminshall termblock(direction, new, 0);
56530051Sminshall direction = new;
56630051Sminshall }
56730051Sminshall while (((c = getchar()) != EOF) && (c != '\n') && (isxdigit(c))) {
56830051Sminshall #define NORMAL 0
56930051Sminshall #define GOT0XFF 0xff
57030051Sminshall static int state = NORMAL;
57130051Sminshall
57230051Sminshall c1 = getchar();
57330051Sminshall c = (GetXValue(c) << 4) + GetXValue(c1);
57430051Sminshall switch (state) {
57530051Sminshall case NORMAL:
57630051Sminshall if (c == 0xff) {
57730051Sminshall state = GOT0XFF;
57830051Sminshall } else {
57930051Sminshall *p++ = c;
58030051Sminshall }
58130051Sminshall break;
58230051Sminshall case GOT0XFF:
58330051Sminshall if (c == 0xef) {
58430051Sminshall termblock(direction, direction, 1);
58530051Sminshall } else {
58630051Sminshall *p++ = 0xff;
58730051Sminshall *p++ = c;
58830051Sminshall }
58930051Sminshall state = NORMAL;
59030051Sminshall }
59130051Sminshall }
59230051Sminshall }
59330051Sminshall return 0;
59430051Sminshall }
595