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