|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.