130051Sminshall #ifndef lint 230051Sminshall static char sccsid[] = "@(#)prt3270.c 3.1 10/29/86"; 330051Sminshall #endif /* ndef lint */ 430051Sminshall 530051Sminshall 630051Sminshall #if defined(unix) 730051Sminshall #endif 830051Sminshall #include <stdio.h> 930051Sminshall #include <ctype.h> 1030051Sminshall 11*31102Sminshall #include "../general.h" 12*31102Sminshall 1330051Sminshall #include "../ascii/ascebc.h" 1430051Sminshall #include "../ctlr/hostctlr.h" 1530051Sminshall #include "../ctlr/screen.h" 1630051Sminshall #define DEFINEAIDS 1730051Sminshall #define LETS_SEE_ASCII 1830051Sminshall #include "../keyboard/m4.out" 1930051Sminshall #include "../system/globals.h" 2030051Sminshall 2130051Sminshall 2230051Sminshall int NumberColumns = 80; 2330051Sminshall 2430051Sminshall int direction; 2530051Sminshall 2630051Sminshall int column = 1; 2730051Sminshall int indenting = 0; 2830051Sminshall int direction = '?'; 2930051Sminshall 3030051Sminshall unsigned char printBuffer[200], *print = printBuffer; 3130051Sminshall 3230051Sminshall #define ColsLeft() (79-column) /* A little room for error */ 3330051Sminshall 3430051Sminshall 3530051Sminshall void 3630051Sminshall putSpace() 3730051Sminshall { 3830051Sminshall extern void Column1(); 3930051Sminshall unsigned char *ourPrint = print; 4030051Sminshall 4130051Sminshall print = printBuffer; /* For mutual calls */ 4230051Sminshall *ourPrint = 0; 4330051Sminshall if (ColsLeft() < 0) { 4430051Sminshall Column1(); 4530051Sminshall } 4630051Sminshall if (column != (indenting*8+1)) { 4730051Sminshall putchar(' '); 4830051Sminshall } else { 4930051Sminshall int i; 5030051Sminshall 5130051Sminshall putchar(direction); 5230051Sminshall putchar(' '); 5330051Sminshall for (i = 0; i < indenting; i++) { 5430051Sminshall putchar('\t'); 5530051Sminshall } 5630051Sminshall } 5730051Sminshall printf("%s", printBuffer); 5830051Sminshall column += strlen(printBuffer); 5930051Sminshall } 6030051Sminshall 6130051Sminshall void 6230051Sminshall Column1() 6330051Sminshall { 6430051Sminshall if (print != printBuffer) { 6530051Sminshall putSpace(); 6630051Sminshall } 6730051Sminshall if (column != (indenting*8+1)) { 6830051Sminshall putchar('\n'); 6930051Sminshall column = indenting*8+1; 7030051Sminshall } 7130051Sminshall } 7230051Sminshall 7330051Sminshall void 7430051Sminshall Indent() 7530051Sminshall { 7630051Sminshall if ((column != (indenting*8+1)) || (print != printBuffer)) { 7730051Sminshall Column1(); 7830051Sminshall } 7930051Sminshall indenting++; 8030051Sminshall column = indenting*8+1; 8130051Sminshall } 8230051Sminshall 8330051Sminshall void 8430051Sminshall Undent() 8530051Sminshall { 8630051Sminshall if ((column != (indenting*8+1)) || (print != printBuffer)) { 8730051Sminshall Column1(); 8830051Sminshall } 8930051Sminshall indenting--; 9030051Sminshall if (indenting < 0) { 9130051Sminshall fflush(stdout); 9230051Sminshall fprintf(stderr, "INTERNAL ERROR: indenting < 0.\n"); 9330051Sminshall fflush(stderr); 9430051Sminshall } else { 9530051Sminshall column = indenting*8+1; 9630051Sminshall } 9730051Sminshall } 9830051Sminshall 9930051Sminshall void 10030051Sminshall putChar(character) 10130051Sminshall int character; 10230051Sminshall { 10330051Sminshall *print++ = character; 10430732Sminshall column++; 10530051Sminshall } 10630051Sminshall 10730051Sminshall void 10830051Sminshall putstr(s) 10930051Sminshall char *s; 11030051Sminshall { 11130051Sminshall while (*s) { 11230051Sminshall putChar(*s++); 11330051Sminshall } 11430051Sminshall } 11530051Sminshall 11630051Sminshall void 11730051Sminshall put2hex(i) 11830051Sminshall int i; 11930051Sminshall { 12030051Sminshall char place[40]; 12130051Sminshall 12230051Sminshall sprintf(place, "%02x", i); 12330051Sminshall putstr(place); 12430051Sminshall } 12530051Sminshall 12630051Sminshall 12730051Sminshall void 12830051Sminshall putdecimal(i) 12930051Sminshall int i; 13030051Sminshall { 13130051Sminshall char place[40]; 13230051Sminshall 13330051Sminshall sprintf(place, "%d", i); 13430051Sminshall putstr(place); 13530051Sminshall } 13630051Sminshall 13730051Sminshall void 13830051Sminshall puthex(i) 13930051Sminshall int i; 14030051Sminshall { 14130051Sminshall char place[40]; 14230051Sminshall 14330051Sminshall sprintf(place, "%x", i); 14430051Sminshall putstr(place); 14530051Sminshall } 14630051Sminshall 14730051Sminshall void 14830051Sminshall putEChar(character) 14930051Sminshall int character; 15030051Sminshall { 15130051Sminshall putChar(ebcasc[0][character]); 15230051Sminshall if (ColsLeft() < 10) { 15330051Sminshall Column1(); 15430051Sminshall } 15530051Sminshall } 15630051Sminshall 15730051Sminshall void 15830051Sminshall PrintAid(i) 15930051Sminshall int i; 16030051Sminshall { 16130051Sminshall TC_AsciiAids_t *TC; 16230051Sminshall 16330051Sminshall for (TC = &TC_AsciiAids[TC_LOWEST_AID-TC_LOWEST]; 16430051Sminshall TC <= &TC_AsciiAids[TC_HIGHEST_AID-TC_LOWEST]; TC++) { 16530051Sminshall if ((TC->tc_aid&0xff) == i) { 16630051Sminshall putstr(TC->tc_name); 16730051Sminshall return; 16830051Sminshall } 16930051Sminshall } 17030051Sminshall 17130051Sminshall putstr("Unknown AID 0x"); 17230051Sminshall put2hex(i); 17330051Sminshall } 17430051Sminshall 17530051Sminshall void 17630051Sminshall PrintAddr(i) 17730051Sminshall int i; 17830051Sminshall { 17930051Sminshall if (ColsLeft() < 9) { 18030051Sminshall Column1(); 18130051Sminshall } 18230051Sminshall putChar('('); 18330051Sminshall putdecimal(ScreenLine(i)); 18430051Sminshall putChar(','); 18530051Sminshall putdecimal(ScreenLineOffset(i)); 18630051Sminshall putChar(')'); 18730051Sminshall } 18830051Sminshall 18930051Sminshall 19030051Sminshall /* returns the number of characters consumed */ 19130051Sminshall int 19230051Sminshall DataFromNetwork(buffer, count, control) 19330051Sminshall register unsigned char *buffer; /* what the data is */ 19430051Sminshall register int count; /* and how much there is */ 19530051Sminshall int control; /* this buffer ended block? */ 19630051Sminshall { 19730051Sminshall int origCount; 19830051Sminshall register int c; 19930051Sminshall register int i; 20030051Sminshall static int Command; 20130051Sminshall static int Wcc; 20230051Sminshall static int LastWasTerminated = 1; /* was "control" = 1 last time? */ 20330051Sminshall 20430051Sminshall if (count == 0) { 20530051Sminshall Column1(); 20630051Sminshall return 0; 20730051Sminshall } 20830051Sminshall 20930051Sminshall origCount = count; 21030051Sminshall 21130051Sminshall if (LastWasTerminated) { 21230051Sminshall 21330051Sminshall if (count < 2) { 21430051Sminshall if (count == 0) { 21530051Sminshall fflush(stdout); 21630051Sminshall fprintf(stderr, "Short count received from host!\n"); 21730051Sminshall fflush(stderr); 21830051Sminshall return(count); 21930051Sminshall } 22030051Sminshall Command = buffer[0]; 22130051Sminshall switch (Command) { /* This had better be a read command */ 22230051Sminshall case CMD_READ_MODIFIED: 22330051Sminshall putstr("read_modified command\n"); 22430051Sminshall break; 22530051Sminshall case CMD_SNA_READ_MODIFIED: 22630051Sminshall putstr("read_modified command\n"); 22730051Sminshall break; 22830051Sminshall case CMD_SNA_READ_MODIFIED_ALL: 22930051Sminshall putstr("read_modified command\n"); 23030051Sminshall break; 23130051Sminshall case CMD_READ_BUFFER: 23230051Sminshall putstr("read_modified command\n"); 23330051Sminshall break; 23430051Sminshall case CMD_SNA_READ_BUFFER: 23530051Sminshall putstr("read_modified command\n"); 23630051Sminshall break; 23730051Sminshall default: 23830051Sminshall break; 23930051Sminshall } 24030051Sminshall return(1); /* We consumed everything */ 24130051Sminshall } 24230051Sminshall Command = buffer[0]; 24330051Sminshall Wcc = buffer[1]; 24430051Sminshall switch (Command) { 24530051Sminshall case CMD_ERASE_WRITE: 24630051Sminshall putstr("erase write command "); 24730051Sminshall break; 24830051Sminshall case CMD_ERASE_WRITE_ALTERNATE: 24930051Sminshall putstr("erase write alternate command "); 25030051Sminshall break; 25130051Sminshall case CMD_SNA_ERASE_WRITE: 25230051Sminshall putstr("sna erase write command "); 25330051Sminshall break; 25430051Sminshall case CMD_SNA_ERASE_WRITE_ALTERNATE: 25530051Sminshall putstr("erase write alternate command "); 25630051Sminshall break; 25730051Sminshall case CMD_ERASE_ALL_UNPROTECTED: 25830051Sminshall putstr("erase all unprotected command "); 25930051Sminshall break; 26030051Sminshall case CMD_SNA_ERASE_ALL_UNPROTECTED: 26130051Sminshall putstr("sna erase write command "); 26230051Sminshall break; 26330051Sminshall case CMD_WRITE: 26430051Sminshall putstr("write command "); 26530051Sminshall break; 26630051Sminshall case CMD_SNA_WRITE: 26730051Sminshall putstr("sna write command "); 26830051Sminshall break; 26930051Sminshall default: 27030051Sminshall putstr("Unexpected command code 0x"); 27130051Sminshall puthex(Command); 27230051Sminshall putstr(" received."); 27330051Sminshall Column1(); 27430051Sminshall break; 27530051Sminshall } 27630051Sminshall putstr("WCC is 0x"); 27730051Sminshall puthex(Wcc); 27830051Sminshall Column1(); 27930051Sminshall 28030051Sminshall count -= 2; /* strip off command and wcc */ 28130051Sminshall buffer += 2; 28230051Sminshall 28330051Sminshall } 28430051Sminshall LastWasTerminated = 0; /* then, reset at end... */ 28530051Sminshall 28630051Sminshall while (count) { 28730051Sminshall count--; 28830051Sminshall c = *buffer++; 28930051Sminshall if (IsOrder(c)) { 29030051Sminshall /* handle an order */ 29130051Sminshall switch (c) { 29230051Sminshall # define Ensure(x) if (count < x) { \ 29330051Sminshall if (!control) { \ 29430051Sminshall return(origCount-(count+1)); \ 29530051Sminshall } else { \ 29630051Sminshall /* XXX - should not occur */ \ 29730051Sminshall count = 0; \ 29830051Sminshall break; \ 29930051Sminshall } \ 30030051Sminshall } 30130051Sminshall case ORDER_SF: 30230051Sminshall Ensure(1); 30330051Sminshall c = *buffer++; 30430051Sminshall count--; 30530051Sminshall putstr("SF (0x"); 30630051Sminshall put2hex(c); 30730051Sminshall putstr(") "); 30830051Sminshall break; 30930051Sminshall case ORDER_SBA: 31030051Sminshall Ensure(2); 31130051Sminshall i = buffer[0]; 31230051Sminshall c = buffer[1]; 31330051Sminshall buffer += 2; 31430051Sminshall count -= 2; 31530051Sminshall putstr("SBA to "); 31630051Sminshall PrintAddr(Addr3270(i,c)); 31730051Sminshall putSpace(); 31830051Sminshall break; 31930051Sminshall case ORDER_IC: 32030051Sminshall putstr("IC"); 32130051Sminshall putSpace(); 32230051Sminshall break; 32330051Sminshall case ORDER_PT: 32430051Sminshall putstr("PT"); 32530051Sminshall putSpace(); 32630051Sminshall break; 32730051Sminshall case ORDER_RA: 32830051Sminshall Ensure(3); 32930051Sminshall i = Addr3270(buffer[0], buffer[1]); 33030051Sminshall c = buffer[2]; 33130051Sminshall buffer += 3; 33230051Sminshall count -= 3; 33330051Sminshall putstr("RA to "); 33430051Sminshall PrintAddr(i); 33530051Sminshall putstr(" of 0x"); 33630051Sminshall put2hex(c); 33730051Sminshall putSpace(); 33830051Sminshall break; 33930051Sminshall case ORDER_EUA: /* (from [here,there), ie: half open interval] */ 34030051Sminshall Ensure(2); 34130051Sminshall putstr("EUA to "); 34230051Sminshall PrintAddr(Addr3270(buffer[0], buffer[1])); 34330051Sminshall putSpace(); 34430051Sminshall buffer += 2; 34530051Sminshall count -= 2; 34630051Sminshall break; 34730051Sminshall case ORDER_YALE: /* special YALE defined order */ 34830051Sminshall Ensure(2); /* need at least two characters */ 34930051Sminshall putstr("YALE order"); 35030051Sminshall putSpace(); 35130051Sminshall break; 35230051Sminshall default: 35330051Sminshall putstr("UNKNOWN ORDER: 0x"); 35430051Sminshall put2hex(c); 35530051Sminshall putSpace(); 35630051Sminshall break; 35730051Sminshall } 35830051Sminshall if (count < 0) { 35930051Sminshall count = 0; 36030051Sminshall } 36130051Sminshall } else { 36230051Sminshall /* Data comes in large clumps - take it all */ 36330051Sminshall putstr("DATA:"); 36430051Sminshall Indent(); 36530051Sminshall putEChar(c); 36630051Sminshall c = *buffer; 36730051Sminshall while (count && !IsOrder(c)) { 36830051Sminshall putEChar(c); 36930051Sminshall count--; 37030051Sminshall buffer++; 37130051Sminshall c = *buffer; 37230051Sminshall } 37330051Sminshall Undent(); 37430051Sminshall } 37530051Sminshall } 37630051Sminshall LastWasTerminated = control; 37730051Sminshall return origCount - count; 37830051Sminshall } 37930051Sminshall 38030051Sminshall int 38130051Sminshall DataToNetwork(buffer, count, control) 38230051Sminshall unsigned char *buffer; 38330051Sminshall int count; 38430051Sminshall int control; 38530051Sminshall { 38630051Sminshall #define NEED_AID 0 38730051Sminshall #define JUST_GOT_AID 1 38830051Sminshall #define DATA 2 38930051Sminshall #define DATA_CONTINUE 3 39030051Sminshall static int state = NEED_AID; 39130051Sminshall static int aid; 39230051Sminshall int origCount = count; 39330051Sminshall 39430051Sminshall if (count == 0) { 39530051Sminshall if (control) { 39630051Sminshall state = NEED_AID; 39730051Sminshall } 39830051Sminshall Column1(); 39930051Sminshall return 0; 40030051Sminshall } 40130051Sminshall 40230051Sminshall switch (state) { 40330051Sminshall case NEED_AID: 40430051Sminshall aid = buffer[0]; 40530051Sminshall buffer++; 40630051Sminshall count--; 40730051Sminshall PrintAid(aid); 40830051Sminshall putSpace(); 40930051Sminshall if (aid == TCtoAid(TC_TREQ)) { 41030051Sminshall state = DATA; 41130051Sminshall } else { 41230051Sminshall state = JUST_GOT_AID; 41330051Sminshall } 41430051Sminshall return origCount - count + DataToNetwork(buffer, count, control); 41530051Sminshall case JUST_GOT_AID: 41630051Sminshall Ensure(2); 41730051Sminshall PrintAddr(Addr3270(buffer[0], buffer[1])); 41830051Sminshall putSpace(); 41930051Sminshall buffer += 2; 42030051Sminshall count -= 2; 42130051Sminshall state = DATA; 42230051Sminshall return origCount - count + DataToNetwork(buffer, count, control); 42330051Sminshall case DATA: 42430051Sminshall case DATA_CONTINUE: 42530051Sminshall while (count) { 42630051Sminshall if (*buffer == ORDER_SBA) { 42730051Sminshall if (state == DATA_CONTINUE) { 42830051Sminshall Undent(); 42930051Sminshall state = DATA; 43030051Sminshall } 43130051Sminshall putstr("SBA "); 43230051Sminshall PrintAddr(Addr3270(buffer[1], buffer[2])); 43330051Sminshall putSpace(); 43430051Sminshall buffer += 3; 43530051Sminshall count -= 3; 43630051Sminshall } else { 43730051Sminshall if (state == DATA) { 43830051Sminshall putstr("DATA:"); 43930051Sminshall Indent(); 44030051Sminshall state = DATA_CONTINUE; 44130051Sminshall } 44230051Sminshall putEChar(*buffer); 44330051Sminshall buffer++; 44430051Sminshall count--; 44530051Sminshall } 44630051Sminshall } 44730051Sminshall if (control) { 44830051Sminshall if (state == DATA_CONTINUE) { 44930051Sminshall Undent(); 45030051Sminshall } 45130051Sminshall state = NEED_AID; 45230051Sminshall } 45330051Sminshall return origCount-count; 45430051Sminshall } 45530051Sminshall } 45630051Sminshall 45730051Sminshall int 45830051Sminshall GetXValue(c) 45930051Sminshall int c; 46030051Sminshall { 46130051Sminshall if (!isascii(c)) { 46230051Sminshall fflush(stdout); 46330051Sminshall fprintf(stderr, "Non-hex digit 0x%x.\n"); 46430051Sminshall fflush(stderr); 46530051Sminshall return 0; 46630051Sminshall } else { 46730051Sminshall if (islower(c)) { 46830051Sminshall return (c-'a')+10; 46930051Sminshall } else if (isupper(c)) { 47030051Sminshall return (c-'A')+10; 47130051Sminshall } else { 47230051Sminshall return c-'0'; 47330051Sminshall } 47430051Sminshall } 47530051Sminshall } 47630051Sminshall 47730051Sminshall unsigned char outbound[8192], inbound[8192], 47830051Sminshall *outnext = outbound, *innext = inbound, *p = 0; 47930051Sminshall 48030051Sminshall void 48130051Sminshall termblock(old, new, control) 48230051Sminshall int old, 48330051Sminshall new; /* old and new directions */ 48430051Sminshall { 48530051Sminshall int count; 48630051Sminshall 48730051Sminshall if (p) { 48830051Sminshall if (old == '<') { 48930051Sminshall outnext = p; 49030051Sminshall count = DataFromNetwork(outbound, outnext-outbound, control); 49130051Sminshall if (outbound+count == outnext) { 49230051Sminshall outnext = outbound; 49330051Sminshall } else { 494*31102Sminshall memcpy(outbound, outbound+count, outnext-(outbound+count)); 49530051Sminshall outnext = outbound+count; 49630051Sminshall } 49730051Sminshall } else { 49830051Sminshall innext = p; 49930051Sminshall count = DataToNetwork(inbound, innext-inbound, control); 50030051Sminshall if (inbound+count == innext) { 50130051Sminshall innext = inbound; 50230051Sminshall } else { 503*31102Sminshall memcpy(inbound, inbound+count, innext-(inbound+count)); 50430051Sminshall innext = inbound+count; 50530051Sminshall } 50630051Sminshall } 50730051Sminshall } 50830051Sminshall if (new == '<') { 50930051Sminshall p = outnext; 51030051Sminshall } else if (new == '>') { 51130051Sminshall p = innext; 51230051Sminshall } else { 51330051Sminshall fprintf(stderr, "Bad direction character '%c'.\n", new); 51430051Sminshall exit(1); 51530051Sminshall } 51630051Sminshall } 51730051Sminshall 51830051Sminshall main() 51930051Sminshall { 52030051Sminshall int location; 52130051Sminshall int new; 52230051Sminshall int c, c1; 52330051Sminshall 524*31102Sminshall memset(Orders, 0, sizeof Orders); 52530051Sminshall Orders[ORDER_SF] = Orders[ORDER_SBA] = Orders[ORDER_IC] 52630051Sminshall = Orders[ORDER_PT] = Orders[ORDER_RA] = Orders[ORDER_EUA] 52730051Sminshall = Orders[ORDER_YALE] = 1; 52830051Sminshall 52930051Sminshall while (scanf("%c 0x%x\t", &new, &location) != EOF) { 53030051Sminshall if (new != direction) { 53130051Sminshall termblock(direction, new, 0); 53230051Sminshall direction = new; 53330051Sminshall } 53430051Sminshall while (((c = getchar()) != EOF) && (c != '\n') && (isxdigit(c))) { 53530051Sminshall #define NORMAL 0 53630051Sminshall #define GOT0XFF 0xff 53730051Sminshall static int state = NORMAL; 53830051Sminshall 53930051Sminshall c1 = getchar(); 54030051Sminshall c = (GetXValue(c) << 4) + GetXValue(c1); 54130051Sminshall switch (state) { 54230051Sminshall case NORMAL: 54330051Sminshall if (c == 0xff) { 54430051Sminshall state = GOT0XFF; 54530051Sminshall } else { 54630051Sminshall *p++ = c; 54730051Sminshall } 54830051Sminshall break; 54930051Sminshall case GOT0XFF: 55030051Sminshall if (c == 0xef) { 55130051Sminshall termblock(direction, direction, 1); 55230051Sminshall } else { 55330051Sminshall *p++ = 0xff; 55430051Sminshall *p++ = c; 55530051Sminshall } 55630051Sminshall state = NORMAL; 55730051Sminshall } 55830051Sminshall } 55930051Sminshall } 56030051Sminshall return 0; 56130051Sminshall } 562