|
|
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.