1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: */
6:
7: #ifndef lint
8: static char sccsid[] = "@(#)rvcat.c 5.1 (Berkeley) 5/15/85";
9: #endif not lint
10:
11: /*
12: * Cat Simulator for Versatec and Varian
13: * Modified for Varian with rotated fonts: wnj 5/30/80.
14: *
15: * Takes two extra special codes defined by rvsort:
16: * 0115 - break for new page, goto (0,0)
17: * 0116 - lead 64* following byte
18: */
19:
20: #include <stdio.h>
21: #include <sys/vcmd.h>
22: #include <vfont.h>
23:
24: int prtmode[] = {VPRINT};
25: int pltmode[] = {VPLOT};
26:
27: #define DISPATCHSIZE 256 /* must be a power of two */
28: #define CHARMASK (DISPATCHSIZE-1)
29: #define NFONTS 25
30: #define SPECIALFONT 3
31: #define DSIZ ((sizeof *dispatch)*DISPATCHSIZE)
32: #define MAXF 4
33:
34: #define LOCAL_RAILMAG ".railmag"
35: #define GLOBAL_RAILMAG "/usr/lib/vfont/railmag"
36:
37: /*
38: * Here we make up for the fact that we only have 2112
39: * bits vertically when we need 2200 (11''*200/in), by
40: * a 4% vertical size squashing.
41: */
42: #define CONVERT(n) ((n*(200./432.))*(2112./2200.))
43: #define RECONVERT(n) ((n*(432./200.))*(2200./2112.))
44:
45: #define NLINES 110
46:
47: #define FF_LINES 1600 /* Scan lines to output before formfeeding. */
48:
49: #define min(a,b) (a<b ? a : b)
50:
51: char buffer[NLINES * 264]; /* Big enough for varain */
52: char *buf0p = &buffer[0]; /* Zero origin in circular buffer */
53:
54: char *calloc();
55: char *nalloc();
56: char *allpanic();
57:
58: struct header ;
59: struct dispatch *dispatch;
60:
61: struct fontdes {
62: int fnum;
63: int psize;
64: struct dispatch *disp;
65: char *bits;
66: } fontdes[NFONTS] = {
67: -1,
68: -1
69: };
70:
71: struct point_sizes {
72: int stupid_code;
73: int real_code;
74: } point_sizes[] = {
75: 010, 6,
76: 0, 7,
77: 01, 8,
78: 07, 9,
79: 02, 10,
80: 03, 11,
81: 04, 12,
82: 05, 14,
83: 0211, 16,
84: 06, 18,
85: 0212, 20,
86: 0213, 22,
87: 0214, 24,
88: 0215, 28,
89: 0216, 36,
90: 0, 0
91: };
92:
93: int lines;
94:
95: int vc = 1; /* varian/versatec output file descriptor */
96: int varian = 1; /* 0 for versatec, 1 for varian. */
97: int BYTES_PER_LINE = 264; /* number of bytes per raster line. */
98: int PAGE_LINES = 1700; /* number of raster lines per page. */
99: int BUFFER_SIZE = NLINES * 264; /* buffer size. */
100: int cfnum = -1;
101: int cpsize = 10;
102: int cfont = 1;
103: char *bits;
104: int nfontnum = -1;
105: int fontwanted = 1;
106: int npsize = 10;
107: int last_ssize = 02;
108: int xpos, ypos;
109: int esc, lead, back, verd, mcase, railmag;
110: double row, col;
111: char *fontname[MAXF];
112: char fnbuf[120];
113: char *scanline;
114: int linecount;
115:
116: char asctab[128] = {
117: '\0', /*blank*/
118: 'h', /*h*/
119: 't', /*t*/
120: 'n', /*n*/
121: 'm', /*m*/
122: 'l', /*l*/
123: 'i', /*i*/
124: 'z', /*z*/
125: 's', /*s*/
126: 'd', /*d*/
127: 'b', /*b*/
128: 'x', /*x*/
129: 'f', /*f*/
130: 'j', /*j*/
131: 'u', /*u*/
132: 'k', /*k*/
133: '\0', /*blank*/
134: 'p', /*p*/
135: '\06', /*_ 3/4 em dash*/
136: ';', /*;*/
137: '\0', /*blank*/
138: 'a', /*a*/
139: '\05', /*rule*/
140: 'c', /*c*/
141: '`', /*` open*/
142: 'e', /*e*/
143: '\'', /*' close*/
144: 'o', /*o*/
145: '\021', /*1/4*/
146: 'r', /*r*/
147: '\022', /*1/2*/
148: 'v', /*v*/
149: '-', /*- hyphen*/
150: 'w', /*w*/
151: 'q', /*q*/
152: '/', /*/*/
153: '.', /*.*/
154: 'g', /*g*/
155: '\023', /*3/4*/
156: ',', /*,*/
157: '&', /*&*/
158: 'y', /*y*/
159: '\0', /*blank*/
160: '%', /*%*/
161: '\0', /*blank*/
162: 'Q', /*Q*/
163: 'T', /*T*/
164: 'O', /*O*/
165: 'H', /*H*/
166: 'N', /*N*/
167: 'M', /*M*/
168: 'L', /*L*/
169: 'R', /*R*/
170: 'G', /*G*/
171: 'I', /*I*/
172: 'P', /*P*/
173: 'C', /*C*/
174: 'V', /*V*/
175: 'E', /*E*/
176: 'Z', /*Z*/
177: 'D', /*D*/
178: 'B', /*B*/
179: 'S', /*S*/
180: 'Y', /*Y*/
181: '\0', /*blank*/
182: 'F', /*F*/
183: 'X', /*X*/
184: 'A', /*A*/
185: 'W', /*W*/
186: 'J', /*J*/
187: 'U', /*U*/
188: 'K', /*K*/
189: '0', /*0*/
190: '1', /*1*/
191: '2', /*2*/
192: '3', /*3*/
193: '4', /*4*/
194: '5', /*5*/
195: '6', /*6*/
196: '7', /*7*/
197: '8', /*8*/
198: '9', /*9*/
199: '*', /***/
200: '\04', /*minus*/
201: '\01', /*fi*/
202: '\02', /*fl*/
203: '\03', /*ff*/
204: '\020', /* cent sign */
205: '\012', /*ffl*/
206: '\011', /*ffi*/
207: '(', /*(*/
208: ')', /*)*/
209: '[', /*[*/
210: ']', /*]*/
211: '\013', /* degree */
212: '\014', /* dagger */
213: '=', /*=*/
214: '\017', /* registered */
215: ':', /*:*/
216: '+', /*+*/
217: '\0', /*blank*/
218: '!', /*!*/
219: '\07', /* bullet */
220: '?', /*?*/
221: '\015', /*foot mark*/
222: '|', /*|*/
223: '\0', /*blank*/
224: '\016', /* copyright */
225: '\010', /* square */
226: '$', /*$*/
227: '\0',
228: '\0',
229: '"', /*"*/
230: '#', /*#*/
231: '<', /*<*/
232: '>', /*>*/
233: '@', /*@*/
234: '\\', /*\\*/
235: '^', /*^*/
236: '{', /*{*/
237: '}', /*}*/
238: '~' /*~*/
239: };
240:
241: char spectab[128] = {
242: '\0', /*blank*/
243: 'w', /*psi*/
244: 'h', /*theta*/
245: 'm', /*nu*/
246: 'l', /*mu*/
247: 'k', /*lambda*/
248: 'i', /*iota*/
249: 'f', /*zeta*/
250: 'r', /*sigma*/
251: 'd', /*delta*/
252: 'b', /*beta*/
253: 'n', /*xi*/
254: 'g', /*eta*/
255: 'u', /*phi*/
256: 't', /*upsilon*/
257: 'j', /*kappa*/
258: '\0', /*blank*/
259: 'p', /*pi*/
260: '@', /*at-sign*/
261: '7', /*down arrow*/
262: '\0', /*blank*/
263: 'a', /*alpha*/
264: '|', /*or*/
265: 'v', /*chi*/
266: '"', /*"*/
267: 'e', /*epsilon*/
268: '=', /*=*/
269: 'o', /*omicron*/
270: '4', /*left arrow*/
271: 'q', /*rho*/
272: '6', /*up arrow*/
273: 's', /*tau*/
274: '_', /*underrule*/
275: '\\', /*\*/
276: 'W', /*Psi*/
277: '\07', /*bell system sign*/
278: '\001', /*infinity*/
279: 'c', /*gamma*/
280: '\002', /*improper superset*/
281: '\003', /*proportional to*/
282: '\004', /*right hand*/
283: 'x', /*omega*/
284: '\0', /*blank*/
285: '(', /*gradient*/
286: '\0', /*blank*/
287: 'U', /*Phi*/
288: 'H', /*Theta*/
289: 'X', /*Omega*/
290: '\005', /*cup (union)*/
291: '\006', /*root en*/
292: '\014', /*terminal sigma*/
293: 'K', /*Lambda*/
294: '-', /*minus*/
295: 'C', /*Gamma*/
296: '\015', /*integral sign*/
297: 'P', /*Pi*/
298: '\032', /*subset of*/
299: '\033', /*superset of*/
300: '2', /*approximates*/
301: 'y', /*partial derivative*/
302: 'D', /*Delta*/
303: '\013', /*square root*/
304: 'R', /*Sigma*/
305: '1', /*approx =*/
306: '\0', /*blank*/
307: '>', /*>*/
308: 'N', /*Xi*/
309: '<', /*<*/
310: '\016', /*slash (longer)*/
311: '\034', /*cap (intersection)*/
312: 'T', /*Upsilon*/
313: '\035', /*not*/
314: '\023', /*right ceiling (rt of ")*/
315: '\024', /*left top (of big curly)*/
316: '\017', /*bold vertical*/
317: '\030', /*left center of big curly bracket*/
318: '\025', /*left bottom*/
319: '\026', /*right top*/
320: '\031', /*right center of big curly bracket*/
321: '\027', /*right bot*/
322: '\021', /*right floor (rb of ")*/
323: '\020', /*left floor (left bot of big sq bract)*/
324: '\022', /*left ceiling (lt of ")*/
325: '*', /*multiply*/
326: '/', /*divide*/
327: '\010', /*plus-minus*/
328: '\011', /*<=*/
329: '\012', /*>=*/
330: '0', /*identically equal*/
331: '3', /*not equal*/
332: '{', /*{*/
333: '}', /*}*/
334: '\'', /*' acute accent*/
335: '\`', /*` grave accent*/
336: '^', /*^*/
337: '#', /*sharp*/
338: '\036', /*left hand*/
339: '\037', /*member of*/
340: '~', /*~*/
341: 'z', /*empty set*/
342: '\0', /*blank*/
343: 'Y', /*dbl dagger*/
344: 'Z', /*box rule*/
345: '9', /*asterisk*/
346: '[', /*improper subset*/
347: ']', /*circle*/
348: '\0', /*blank*/
349: '+', /*eqn plus*/
350: '5', /*right arrow*/
351: '8' /*section mark*/
352: };
353:
354: main(argc, argv)
355: int argc;
356: char *argv[];
357: {
358: char *namearg = NULL;
359: char *hostarg = NULL;
360: char *acctfile = NULL;
361:
362: while (--argc) {
363: if (*(*++argv) == '-')
364: switch (argv[0][1]) {
365: case 'x':
366: BYTES_PER_LINE = atoi(&argv[0][2]) / 8;
367: BUFFER_SIZE = NLINES * BYTES_PER_LINE;
368: break;
369:
370: case 'y':
371: PAGE_LINES = atoi(&argv[0][2]);
372: break;
373:
374: case 'n':
375: if (argc > 1) {
376: argc--;
377: namearg = *++argv;
378: }
379: break;
380:
381: case 'h':
382: if (argc > 1) {
383: argc--;
384: hostarg = *++argv;
385: }
386: break;
387: }
388: else
389: acctfile = *argv;
390: }
391: ioctl(vc, VSETSTATE, pltmode);
392: readrm();
393: ofile();
394: ioctl(vc, VSETSTATE, prtmode);
395: if (varian)
396: write(vc, "\f", 2);
397: else
398: write(vc, "\n\n\n\n\n", 6);
399: account(namearg, hostarg, acctfile);
400: exit(0);
401: }
402:
403: readrm()
404: {
405: register int i;
406: register char *cp;
407: register int rmfd;
408: char c;
409:
410: if ((rmfd = open(LOCAL_RAILMAG, 0)) < 0)
411: if ((rmfd = open(GLOBAL_RAILMAG, 0)) < 0) {
412: fprintf(stderr, "rvcat: No railmag file\n");
413: exit(2);
414: }
415: cp = fnbuf;
416: for (i = 0; i < MAXF; i++) {
417: fontname[i] = cp;
418: while (read(rmfd, &c, 1) == 1 && c != '\n')
419: *cp++ = c;
420: *cp++ = '\0';
421: }
422: close(rmfd);
423: }
424:
425: ofile()
426: {
427: register int c;
428: register int i;
429: double scol;
430: static int initialized;
431:
432: lines = 0;
433: while ((c = getchar()) != EOF) {
434: if (!c)
435: continue;
436: if (c & 0200) {
437: esc += (~c) & 0177;
438: continue;
439: }
440: if (esc) {
441: if (back)
442: esc = -esc;
443: col += esc;
444: esc = 0;
445: i = CONVERT(col);
446: while (i >= NLINES) {
447: slop_lines(15);
448: i = CONVERT(col);
449: }
450: ypos = i;
451: }
452: if ((c & 0377) < 0100) /* Purely for efficiency */
453: goto normal_char;
454: switch (c) {
455:
456: case 0100:
457: esc = 0;
458: lead = 0;
459: linecount = 0;
460: verd = 0;
461: back = 0;
462: mcase = 0;
463: railmag = 0;
464: if (loadfont(railmag, cpsize) < 0)
465: fprintf(stderr, "rvcat: Can't load initial font\n");
466: if (initialized)
467: goto reset;
468: initialized = 1;
469: row = 0;
470: xpos = CONVERT(row);
471: for (c = 0; c < BUFFER_SIZE; c++)
472: buffer[c] = 0;
473: col = 0;
474: ypos = 0;
475: break;
476:
477: case 0101: /* lower rail */
478: crail(railmag &= ~01);
479: break;
480:
481: case 0102: /* upper rail */
482: crail(railmag |= 01);
483: break;
484:
485: case 0103: /* upper mag */
486: crail(railmag |= 02);
487: break;
488:
489: case 0104: /* lower mag */
490: crail(railmag &= ~02);
491: break;
492:
493: case 0105: /* lower case */
494: mcase = 0;
495: break;
496:
497: case 0106: /* upper case */
498: mcase = 0100;
499: break;
500:
501: case 0107: /* escape forward */
502: back = 0;
503: break;
504:
505: case 0110: /* escape backwards */
506: back = 1;
507: break;
508:
509: case 0111: /* stop */
510: break;
511:
512: case 0112: /* lead forward */
513: verd = 0;
514: break;
515:
516: case 0113: /* undefined */
517: break;
518:
519: case 0114: /* lead backward */
520: verd = 1;
521: break;
522:
523: case 0115: /* undefined */
524: reset:
525: c = lines % PAGE_LINES;
526: while (c < FF_LINES) {
527: slop_lines(min(FF_LINES - c, NLINES));
528: c = lines % PAGE_LINES;
529: }
530: new_page(PAGE_LINES - c);
531: break;
532:
533: case 0116:
534: lead = (getchar() & 0377) * 64;
535: goto leadin;
536:
537: case 0117:
538: break;
539:
540: default:
541: if ((c & 0340) == 0140) /* leading */ {
542: lead = (~c) & 037;
543: leadin:
544: if (verd)
545: lead = -lead;
546: row += lead*3; /* Lead is 3 units */
547: xpos = CONVERT(row);
548: continue;
549: }
550: if ((c & 0360) == 0120) /* size change */ {
551: loadfont(railmag, findsize(c & 017));
552: continue;
553: }
554: if (c & 0300)
555: continue;
556:
557: normal_char:
558: if (row < 0 || CONVERT(row) >= BYTES_PER_LINE * 8)
559: continue;
560: c = (c & 077) | mcase;
561: outc(c);
562: }
563: }
564: out:
565: slop_lines(NLINES);
566: }
567:
568: findsize(code)
569: register int code;
570: {
571: register struct point_sizes *psp;
572:
573: psp = point_sizes;
574: while (psp->real_code != 0) {
575: if ((psp->stupid_code & 017) == code)
576: break;
577: psp++;
578: }
579: code = 0;
580: if (!(last_ssize & 0200) && (psp->stupid_code & 0200))
581: code = -55;
582: else if ((last_ssize & 0200) && !(psp->stupid_code & 0200))
583: code = 55;
584: if (back)
585: code = -code;
586: esc += code;
587: last_ssize = psp->stupid_code;
588: return(psp->real_code);
589: }
590:
591: account(who, from, acctfile)
592: char *who, *from, *acctfile;
593: {
594: register FILE *a;
595:
596: if (who == NULL || acctfile == NULL)
597: return;
598: if (access(acctfile, 02) || (a = fopen(acctfile, "a")) == NULL)
599: return;
600: /*
601: * Varian accounting is done by 8.5 inch pages;
602: * Versatec accounting is by the (12 inch) foot.
603: */
604: fprintf(a, "t%6.2f\t", (double)lines / (double)PAGE_LINES);
605: if (from != NULL)
606: fprintf(a, "%s:", from);
607: fprintf(a, "%s\n", who);
608: fclose(a);
609: }
610:
611: crail(nrail)
612: register int nrail;
613: {
614: register int psize;
615:
616: psize = cpsize;
617: if (fontwanted && psize != npsize)
618: psize = npsize;
619: loadfont(nrail, psize);
620: }
621:
622:
623: loadfont(fnum, size)
624: register int fnum;
625: register int size;
626: {
627: register int i;
628: char cbuf[80];
629:
630: fontwanted = 0;
631: if (fnum == cfnum && size == cpsize)
632: return(0);
633: for (i = 0; i < NFONTS; i++)
634: if (fontdes[i].fnum == fnum && fontdes[i].psize == size) {
635: cfnum = fontdes[i].fnum;
636: cpsize = fontdes[i].psize;
637: dispatch = &fontdes[i].disp[0];
638: bits = fontdes[i].bits;
639: cfont = i;
640: return(0);
641: }
642: if (fnum < 0 || fnum >= MAXF) {
643: fprintf(stderr, "rvcat: Internal error: illegal font\n");
644: return(-1);
645: }
646: nfontnum = fnum;
647: npsize = size;
648: fontwanted++;
649: return(0);
650: }
651:
652:
653: getfont()
654: {
655: register int fnum, size, font;
656: int d;
657: char cbuf[BUFSIZ];
658: char *cp = cbuf;
659: char *dp;
660:
661: if (!fontwanted)
662: return(0);
663: fnum = nfontnum;
664: size = npsize;
665: sprintf(cbuf, "%s.%dr", fontname[fnum], size);
666: font = open(cbuf, 0);
667: if (font == -1) {
668: fprintf(stderr, "rvcat: ");
669: perror(cbuf);
670: fontwanted = 0;
671: return(-1);
672: }
673: if (read(font, &header, sizeof header)!=sizeof header || header.magic!=0436)
674: fprintf(stderr, "rvcat: %s: Bad font file", cbuf);
675: else {
676: cfont = relfont();
677: if (((bits=nalloc(header.size+DSIZ+1,1))== NULL)
678: && ((bits=allpanic(header.size+DSIZ+1))== NULL)) {
679: fprintf(stderr, "rvcat: %s: ran out of memory\n", cbuf);
680: exit(2);
681: } else {
682: /*
683: * have allocated one chunk of mem for font, dispatch.
684: * get the dispatch addr, align to word boundary.
685: */
686: d = (int) bits+header.size;
687: d += 1;
688: d &= ~1;
689: if (read(font, d, DSIZ)!=DSIZ
690: || read(font, bits, header.size)!=header.size)
691: fprintf(stderr, "rvcat: bad font header");
692: else {
693: close(font);
694: cfnum = fontdes[cfont].fnum = fnum;
695: cpsize = fontdes[cfont].psize = size;
696: fontdes[cfont].bits = bits;
697: fontdes[cfont].disp = (struct dispatch *) d;
698: dispatch = &fontdes[cfont].disp[0];
699: fontwanted = 0;
700: return(0);
701: }
702: }
703: }
704: close(font);
705: fontwanted = 0;
706: return(-1);
707: }
708:
709: int lastloaded = -1;
710:
711: relfont()
712: {
713: register int newfont;
714:
715: newfont = lastloaded;
716: /*
717: * optimization for special font. since we think that usually
718: * there is only one character at a time from any special math
719: * font, make it the candidate for removal.
720: */
721: if (fontdes[cfont].fnum != SPECIALFONT || fontdes[cfont].bits==0)
722: if (++newfont>=NFONTS)
723: newfont = 0;
724: lastloaded = newfont;
725: if ((int)fontdes[newfont].bits != -1 && fontdes[newfont].bits != 0)
726: nfree(fontdes[newfont].bits);
727: fontdes[newfont].bits = 0;
728: return(newfont);
729: }
730:
731: char *
732: allpanic(nbytes)
733: int nbytes;
734: {
735: register int i;
736:
737: for (i = 0; i <= NFONTS; i++)
738: if (fontdes[i].bits != (char *)-1 && fontdes[i].bits != (char *)0)
739: nfree(fontdes[i].bits);
740: lastloaded = cfont;
741: for (i = 0; i <= NFONTS; i++) {
742: fontdes[i].fnum = fontdes[i].psize = -1;
743: fontdes[i].bits = 0;
744: cfnum = cpsize = -1;
745: }
746: return(nalloc(nbytes,1));
747: }
748:
749: int M[] = { 0xffffffff, 0xfefefefe, 0xfcfcfcfc, 0xf8f8f8f8,
750: 0xf0f0f0f0, 0xe0e0e0e0, 0xc0c0c0c0, 0x80808080, 0x0 };
751: int N[] = { 0x00000000, 0x01010101, 0x03030303, 0x07070707,
752: 0x0f0f0f0f, 0x1f1f1f1f, 0x3f3f3f3f, 0x7f7f7f7f, 0xffffffff };
753: int strim[] = { 0xffffffff, 0xffffff00, 0xffff0000, 0xff000000, 0 };
754:
755: outc(code)
756: int code;
757: {
758: char c; /* character to print */
759: register struct dispatch *d; /* ptr to character font record */
760: register char *addr; /* addr of font data */
761: int llen; /* length of each font line */
762: int nlines; /* number of font lines */
763: register char *scanp; /* ptr to output buffer */
764: int scanp_inc; /* increment to start of next buffer */
765: int offset; /* bit offset to start of font data */
766: int i; /* loop counter */
767: register int count; /* font data ptr */
768: register unsigned fontdata; /* font data temporary */
769: register int off8; /* offset + 8 */
770: int b0poff; /* bit offset back towards buf0p */
771:
772: if (fontwanted)
773: getfont();
774: if (railmag == SPECIALFONT) {
775: if ((c = spectab[code]) < 0)
776: return(0);
777: } else if ((c = asctab[code]) < 0)
778: return(0);
779: d = dispatch+c;
780: if (d->nbytes) {
781: addr = bits+d->addr;
782: llen = (d->down+d->up+7)/8;
783: nlines = d->left+d->right;
784: if (ypos+d->right >= NLINES)
785: slop_lines(ypos+d->right-NLINES+6);
786: b0poff = BYTES_PER_LINE*8 - 1 - (xpos+d->down);
787: scanp = ((ypos-d->left-1)*BYTES_PER_LINE+b0poff/8)+buf0p;
788: if (scanp < &buffer[0])
789: scanp += BUFFER_SIZE;
790: scanp_inc = BYTES_PER_LINE-llen;
791: offset = -(b0poff&07);
792: off8 = offset+8;
793: for (i = 0; i < nlines; i++) {
794: if (scanp >= &buffer[BUFFER_SIZE])
795: scanp -= BUFFER_SIZE;
796: count = llen;
797: if (scanp + count <= &buffer[BUFFER_SIZE])
798: do {
799: fontdata = *(unsigned *)addr;
800: addr += 4;
801: if (count < 4)
802: fontdata &= ~strim[count];
803: *(unsigned *)scanp |= (fontdata << offset) &~ M[off8];
804: scanp++;
805: *(unsigned *)scanp |= (fontdata << off8) &~ N[off8];
806: scanp += 3;
807: count -= 4;
808: } while (count > 0);
809: scanp += scanp_inc+count;
810: addr += count;
811: }
812: return(1);
813: }
814: return(0);
815: }
816:
817: slop_lines(ncols)
818: int ncols;
819: {
820: register int i, rcols;
821:
822: lines += ncols;
823: rcols = (&buffer[BUFFER_SIZE] - buf0p) / BYTES_PER_LINE;
824: if (rcols < ncols) {
825: if (write(vc, buf0p, BYTES_PER_LINE * rcols) < 0)
826: exit(1);
827: clear(buf0p, rcols * BYTES_PER_LINE);
828: buf0p = buffer;
829: ncols -= rcols;
830: ypos -= rcols;
831: col -= RECONVERT(rcols);
832: }
833: if (write(vc, buf0p, BYTES_PER_LINE * ncols) < 0)
834: exit(1);
835: clear(buf0p, BYTES_PER_LINE * ncols);
836: buf0p += BYTES_PER_LINE * ncols;
837: if (buf0p >= &buffer[BUFFER_SIZE])
838: buf0p -= BUFFER_SIZE;
839: ypos -= ncols;
840: col -= RECONVERT(ncols);
841: }
842:
843: /*ARGSUSED*/
844: clear(lp, nbytes)
845: int *lp;
846: int nbytes;
847: {
848: asm("movc5 $0,(sp),$0,8(ap),*4(ap)");
849: }
850:
851: /* Start a new page by formfeeding, resetting buffer and column counters. */
852: new_page(lines_left)
853: int lines_left; /* ... on page. */
854: {
855: lines += lines_left;
856: buf0p = buffer; /* Clear out buffer and reset pointers. */
857: clear(buf0p, BYTES_PER_LINE * NLINES);
858: row = 0;
859: col = 0;
860: xpos = CONVERT(row);
861: ypos = 0;
862: ioctl(vc, VSETSTATE, prtmode);
863: write (vc, "\f", 2);
864: ioctl(vc, VSETSTATE, pltmode);
865: }
866:
867: char *
868: nalloc(i, j)
869: int i, j;
870: {
871: register char *cp;
872:
873: cp = calloc(i, j);
874: return(cp);
875: }
876:
877: nfree(cp)
878: char *cp;
879: {
880: free(cp);
881: }