|
|
1.1 ! root 1: /* D.L.Buck and Associates, Inc. - January, 1984. ! 2: * ! 3: * COPYRIGHT NOTICE: ! 4: * Copyright c 1984 - An unpublished work by ! 5: * D.L.Buck and Associates, Inc. ! 6: * ! 7: * PROPRIETARY RIGHTS NOTICE: ! 8: * All rights reserved. This document and program contains ! 9: * proprietary information of D.L.Buck and Associates,Inc. ! 10: * of San Jose, California, U.S.A., embodying confidential ! 11: * information, ideas, and expressions, no part of which ! 12: * may be reproduced, or transmitted in any form or by any ! 13: * means, electronic, mechanical, or otherwise, without ! 14: * the written permission of D.L.Buck and Associates, Inc. ! 15: * ! 16: * NAME ! 17: * emprbuf ! 18: * SYNOPSIS ! 19: * emprbuf(buf,count) ! 20: * char *buf; address of received buffer ! 21: * register int count; number of characters in buffer ! 22: * DESCRIPTION ! 23: * The received buffer should have the format of a received ! 24: * 328x-style buffer, and contain commands, orders, and ! 25: * buffer data for the 328x printer. This routine processes ! 26: * the commands, orders, and buffer data, creating or updating ! 27: * the information in the external variables mentioned in ! 28: * empr.h. ! 29: */ ! 30: #ifndef lint ! 31: static char sccsid[] = "@(#)emprbuf.c 1.4 "; ! 32: #endif ! 33: ! 34: #include <empr.h> ! 35: #include <ctype.h> ! 36: #define NUL '\0' ! 37: ! 38: #define CMDPRE 033 /* Indicates command code follows */ ! 39: /* command types: (Ascii) */ ! 40: #define EWRITE '5' /* Erase/Write */ ! 41: #define WRITE '1' /* Write */ ! 42: #define COPY '7' /* Copy (3271 only) */ ! 43: #define EAU '?' /* Erase All Unprotected */ ! 44: ! 45: /* WRITE and EWRITE are followed by a WCC ... */ ! 46: char wcc; ! 47: ! 48: /* wcc determines line length, saved in maxlen */ ! 49: int maxlen; ! 50: ! 51: /* Buffer Orders: Name: Followed by: */ ! 52: #define SF 0x1d /* Start Field Attr. char */ ! 53: #define SBA 0x11 /* Set Buffer Address 2-byte addr. */ ! 54: #define IC 0x13 /* Insert Cursor (nothing) */ ! 55: #define PT 0x09 /* Program Tab (nothing) */ ! 56: #define RA 0x14 /* Repeat to Addr. 2-byte addr. */ ! 57: #define EUA 0x12 /* Erase Unprot. to Addr. 2-byte addr. */ ! 58: ! 59: /* Printer Orders */ ! 60: #define NL 0x0a /* Newline (nothing) */ ! 61: #define EM 0x19 /* End of Media (nothing) */ ! 62: #define FF 0x0c /* Form Feed (nothing) */ ! 63: #define CR 0x0d /* Carriage Return (nothing) */ ! 64: #define SI 0x0f /* Suppress Index (nothing) */ ! 65: ! 66: #define DATA 1000 /* last thing was data */ ! 67: #define FUNNYPT 1001 /* last thing was PT that wrapped */ ! 68: ! 69: char aadr_tbl[64] = { /* ASCII hex cursor address encoding table */ ! 70: 0x20,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x5b,0x2e, ! 71: 0x3c,0x28,0x2b,0x21,0x26,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50, ! 72: 0x51,0x52,0x5d,0x24,0x2a,0x29,0x3b,0x5e,0x2d,0x2f,0x53,0x54, ! 73: 0x55,0x56,0x57,0x58,0x59,0x5a,0x7c,0x2c,0x25,0x5f,0x3e,0x3f, ! 74: 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x23, ! 75: 0x40,0x27,0x3d,0x22}; ! 76: char eadr_tbl[] = { /* EBCDIC hex cursor address encoding table */ ! 77: 0x40,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0x4a,0x4b, ! 78: 0x4c,0x4d,0x4e,0x4f,0x50,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7, ! 79: 0xd8,0xd9,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,0xe2,0xe3, ! 80: 0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f, ! 81: 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0x7a,0x7b, ! 82: 0x7c,0x7d,0x7e,0x7f}; ! 83: ! 84: emprbuf(buf,count) ! 85: register char *buf; /* address of received buffer */ ! 86: register int count; /* number of characters it contains */ ! 87: { ! 88: extern int ascii; /* ascii or ebcdic code flag */ ! 89: extern char *index(); ! 90: static int ncarry; /* number of characters carried over */ ! 91: static char carrybuf[5];/* carried over characters */ ! 92: static char lastthing; /* last thing we did */ ! 93: register char *p; /* work pointer */ ! 94: register int *ip; /* work pointer */ ! 95: char newchar; ! 96: char clearflag; ! 97: int newbufaddr; ! 98: char *tr_tbl; /* ascii or ebcdic address transl. tbl */ ! 99: ! 100: tr_tbl = ascii?aadr_tbl:eadr_tbl; ! 101: unfiximage(); ! 102: while (ncarry) { /* if chars were left over from last block, */ ! 103: *--buf = carrybuf[--ncarry]; /* prefix them to given block */ ! 104: ++count; ! 105: } ! 106: ! 107: while (--count >= 0) /* for all characters in buffer, */ ! 108: { ! 109: if (!ascii) ! 110: ebcasc(buf,1); ! 111: switch (*buf) { ! 112: case CMDPRE: /* start of command */ ! 113: fiximage(0); ! 114: unfiximage(); ! 115: if (count < 1) { ! 116: ncarry = 1; /* save ESC */ ! 117: goto abort; ! 118: } ! 119: ++buf; --count; ! 120: if (!ascii) ! 121: ebcasc(buf,1); ! 122: lastthing = *buf; /* this is a command */ ! 123: switch (*buf) { ! 124: case EWRITE: /* erase screen, then write */ ! 125: cursaddr = 0; ! 126: bufaddr = 0; ! 127: curfield = 0; ! 128: totfields = 0; ! 129: for (p = scrn_image; ! 130: p < &scrn_image[MAXSCREENSIZE]; ! 131: *p++ = NUL) ; ! 132: for (ip = scrn_xref; ! 133: ip < &scrn_xref[MAXSCREENSIZE]; ! 134: *ip++ = 0) ; ! 135: case WRITE: ! 136: if (count < 1) { /* need wcc, too */ ! 137: ncarry = 2; /* save ESC, cmd */ ! 138: goto abort; ! 139: } ! 140: ++buf; --count; ! 141: wcc = *buf; /* save wcc */ ! 142: if (ascii) ! 143: wcc = eadr_tbl[index(aadr_tbl,wcc)-aadr_tbl]; ! 144: ! 145: if ((wcc & WCCPR80) == WCCPR80) ! 146: maxlen = 80; ! 147: else if ((wcc & WCCPR64) == WCCPR64) ! 148: maxlen = 64; ! 149: else if ((wcc & WCCPR40) == WCCPR40) ! 150: maxlen = 40; ! 151: else ! 152: maxlen = 132; ! 153: /* reset MDT bits; they were saved in scrn_xref */ ! 154: if (wcc & WCCMDTRST) ! 155: for (ip=scrn_xref; ! 156: ip<&scrn_xref[MAXSCREENSIZE];++ip) ! 157: *ip &= ~ATTRMDT; ! 158: if (lastthing == 0 || lastthing == COPY || ! 159: lastthing == EAU) { ! 160: bufaddr = cursaddr; ! 161: if (bufaddr >= MAXSCREENSIZE) ! 162: bufaddr = 0; ! 163: } ! 164: break; ! 165: case EAU: /* erase all unprotected */ ! 166: lastthing = EAU; ! 167: ++buf; --count; ! 168: break; ! 169: } ! 170: break; ! 171: case SF: /* Start Field - followed by attr. char. */ ! 172: if (count < 1) { /* need 1-char attr. */ ! 173: ncarry = 1; /* carry SF forward */ ! 174: goto abort; ! 175: } ! 176: lastthing = SF; ! 177: ++buf; --count; ! 178: scrn_image[bufaddr] = ATTRCODE; /* mark screen image */ ! 179: newchar = *buf; ! 180: if (ascii) ! 181: newchar = eadr_tbl[index(aadr_tbl,newchar)-aadr_tbl]; ! 182: scrn_xref[bufaddr] = newchar; ! 183: ++bufaddr; ! 184: if (bufaddr >= MAXSCREENSIZE) ! 185: bufaddr = 0; ! 186: break; ! 187: ! 188: case SBA: /* Set Buffer Address - followed by addr */ ! 189: if (count < 2) { /* need 2-char addr */ ! 190: ncarry = 1; ! 191: goto abort; ! 192: } ! 193: lastthing = SBA; ! 194: newbufaddr = ((index(tr_tbl,buf[1])-tr_tbl) << 6) | ! 195: (index(tr_tbl,buf[2])-tr_tbl); ! 196: buf += 2; ! 197: count -= 2; ! 198: if (newbufaddr < 0 || newbufaddr >= MAXSCREENSIZE) ! 199: break; ! 200: bufaddr = newbufaddr; ! 201: ! 202: break; ! 203: ! 204: case IC: /* Set Cursor Address */ ! 205: lastthing = IC; ! 206: cursaddr = bufaddr; ! 207: break; ! 208: ! 209: case PT: /* Program Tab */ ! 210: clearflag = (lastthing == 0 || lastthing == DATA || ! 211: lastthing == FUNNYPT); ! 212: lastthing = PT; ! 213: while (scrn_image[bufaddr] != ATTRCODE) { ! 214: if (clearflag) ! 215: scrn_image[bufaddr] = NUL; ! 216: if (++bufaddr >= MAXSCREENSIZE) { ! 217: bufaddr = MAXSCREENSIZE - 1; ! 218: lastthing = FUNNYPT; ! 219: break; ! 220: } ! 221: } ! 222: if (++bufaddr >= MAXSCREENSIZE) ! 223: bufaddr = 0; ! 224: break; ! 225: ! 226: case RA: /* Repeat to Address - followed by addr */ ! 227: if (count < 3) { /* need 2-byte addr, char */ ! 228: ncarry = 1; ! 229: goto abort; ! 230: } ! 231: lastthing = RA; ! 232: newbufaddr = ((index(tr_tbl,buf[1])-tr_tbl) << 6) | ! 233: (index(tr_tbl,buf[2])-tr_tbl); ! 234: if (newbufaddr >= MAXSCREENSIZE) ! 235: newbufaddr = 0; ! 236: newchar = buf[3]; /* char to be repeated */ ! 237: if (!ascii) ! 238: ebcasc(&newchar,1); ! 239: buf += 3; ! 240: count -= 3; ! 241: do { ! 242: scrn_image[bufaddr] = newchar; ! 243: if (++bufaddr >= MAXSCREENSIZE) ! 244: bufaddr = 0; ! 245: } while (bufaddr != newbufaddr); ! 246: break; ! 247: ! 248: case EUA: /* erase unprotected to (following) addr */ ! 249: if (count < 2) { /* need 2-char addr */ ! 250: ncarry = 1; ! 251: goto abort; ! 252: } ! 253: lastthing = EUA; ! 254: newbufaddr = ((index(tr_tbl,buf[1])-tr_tbl) << 6) | ! 255: (index(tr_tbl,buf[2])-tr_tbl); ! 256: buf += 2; ! 257: count -= 2; ! 258: if (newbufaddr <0 || newbufaddr >= MAXSCREENSIZE) ! 259: break; ! 260: ! 261: eua(bufaddr, newbufaddr, 0); ! 262: break; ! 263: case NL: /* newline */ ! 264: lastthing = NL; ! 265: scrn_image[bufaddr] = '\n'; ! 266: if (++bufaddr >= MAXSCREENSIZE) ! 267: bufaddr = 0; ! 268: break; ! 269: case EM: /* end of message; stop printing */ ! 270: lastthing = EM; ! 271: scrn_image[bufaddr] = EM; ! 272: if (++bufaddr >= MAXSCREENSIZE) ! 273: bufaddr = 0; ! 274: break; ! 275: case FF: /* forms feed */ ! 276: lastthing = FF; ! 277: scrn_image[bufaddr] = '\f'; ! 278: if (++bufaddr >= MAXSCREENSIZE) ! 279: bufaddr = 0; ! 280: break; ! 281: case SI: /* suppress index (don't do line feed) */ ! 282: lastthing = SI; ! 283: scrn_image[bufaddr] = SI; ! 284: if (++bufaddr >= MAXSCREENSIZE) ! 285: bufaddr = 0; ! 286: break; ! 287: case CR: /* carriage return */ ! 288: lastthing = CR; ! 289: scrn_image[bufaddr] = '\r'; ! 290: if (++bufaddr >= MAXSCREENSIZE) ! 291: bufaddr = 0; ! 292: break; ! 293: ! 294: default: ! 295: lastthing = DATA; ! 296: scrn_image[bufaddr] = *buf; ! 297: if (++bufaddr >= MAXSCREENSIZE) ! 298: bufaddr = 0; ! 299: break; ! 300: } ! 301: ++buf; ! 302: } ! 303: fiximage(1); ! 304: return; ! 305: ! 306: abort: /* ncarry characters need to be saved in carrybuf */ ! 307: buf -= ncarry; ! 308: strncpy(carrybuf,buf,ncarry+count); ! 309: if (!ascii) ! 310: ascebc(carrybuf,ncarry+count); ! 311: } ! 312: ! 313: /* ! 314: * NAME ! 315: * fiximage ! 316: * SYNOPSIS ! 317: * fiximage(do_all) ! 318: * int do_all; update screen image or not ! 319: * DESCRIPTION ! 320: * Fix up all screen image data structures based on current ! 321: * copy of scrn_image and scrn_xref. ! 322: * ALGORITHM ! 323: * Examine scrn_image and scrn_xref; build correct values ! 324: * for: totfields ! 325: * fldstart ! 326: * fldmax ! 327: * fldattr ! 328: * Examine cursaddr; build correct value for: curfield ! 329: * ! 330: * When an ATTRCODE is found, start a new field: ! 331: * 1) Incr. totfields ! 332: * 2) Set fldstart ! 333: * 3) Copy fldattr from scrn_xref ! 334: * 4) if do_screen, move to starting location, ! 335: * set/clear highlight mode. ! 336: * ! 337: * For a character: ! 338: * 1) Incr. fldmax ! 339: * 2) If do_screen, update screen image ! 340: * 3) assign current field # to scrn_xref ! 341: */ ! 342: int unprotected; /* number of unprotected fields on the screen */ ! 343: fiximage(do_all) ! 344: int do_all; ! 345: { ! 346: register int i, cf; ! 347: register char *sp; ! 348: register int count; ! 349: ! 350: cf = -1; ! 351: totfields = 0; ! 352: unprotected = 0; ! 353: fldstart[0] = 0; ! 354: fldattr[0] = 0; ! 355: fldmax[0] = 0; ! 356: ! 357: for (sp = scrn_image; sp<&scrn_image[MAXSCREENSIZE]; ++sp) ! 358: if (*sp == (char)ATTRCODE) ! 359: break; ! 360: if (sp >= &scrn_image[MAXSCREENSIZE]) { ! 361: sp = scrn_image; ! 362: cf = 0; ! 363: } ! 364: for (i=sp-scrn_image,count=0;count<MAXSCREENSIZE;++count,++i,++sp) { ! 365: if (i>= MAXSCREENSIZE) { ! 366: i = 0; ! 367: sp = scrn_image; ! 368: } ! 369: /* attribute char. or end of screen */ ! 370: if (*sp==(char)ATTRCODE) { ! 371: ++cf; ! 372: ++totfields; ! 373: fldstart[cf] = (i >= MAXSCREENSIZE-1)? 0 : i+1; ! 374: fldattr[cf] = scrn_xref[i]; ! 375: if (!prot_attr(fldattr[cf])) ! 376: ++unprotected; ! 377: fldmax[cf] = 0; ! 378: } ! 379: else ! 380: ++fldmax[cf]; ! 381: scrn_xref[i] = cf; ! 382: } ! 383: curfield = scrn_xref[cursaddr]; ! 384: ! 385: if (walarm(wcc)) ! 386: write (1, "\007",1); /* send alarm */ ! 387: } ! 388: ! 389: /* NAME ! 390: * eua ! 391: * ! 392: * SYNOPSIS ! 393: * eua(start,end,clrmdt) ! 394: * register int start; starting erase buffer address ! 395: * register int end; ending erase buffer address ! 396: * register int clrmdt; clear mdt flag ! 397: * ! 398: * DESCRIPTION ! 399: * eua erases unprotected fields beginning at "start" buffer address ! 400: * and ending at "end" buffer address. If clrmdt flag is set, the ! 401: * mdt bits of unprotected attributes to be erased are reset. ! 402: */ ! 403: ! 404: eua(start,end,clrmdt) ! 405: register int start,end,clrmdt; ! 406: { ! 407: fiximage(0); ! 408: curfield = scrn_xref[start]; ! 409: ! 410: do { ! 411: if (!prot_attr(curfield)) { ! 412: if (scrn_image[start] == ATTRCODE) { ! 413: if (clrmdt) ! 414: fldattr[curfield] &= ~ATTRMDT; ! 415: } ! 416: else ! 417: scrn_image[start] = NUL; ! 418: ! 419: if (++start >= MAXSCREENSIZE) start = 0; ! 420: } ! 421: } ! 422: while (start != end); ! 423: unfiximage(); ! 424: } ! 425: ! 426: /* make temp. attr. save as we may mess up scrn_xref */ ! 427: unfiximage() ! 428: { ! 429: register char *p; ! 430: register int *ip; ! 431: ! 432: for (p = fldattr, ip = fldstart; p < &fldattr[totfields]; ++p,++ip) ! 433: scrn_xref[*ip?*ip - 1:MAXSCREENSIZE-1] = *p; ! 434: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.