SCCS-vsn: local/ditroff/ditroff.old.okeeffe/driver/dver.c 1.13
*
* VAX Versatec driver for the new troff
*
*
* VAX Versatec driver for the new troff
*
#define vmot(n) vgoto(vpos + (n))
#define vmot(n) vgoto(vpos + (n))
-char SccsId[]= "dver.c 1.12 84/02/27";
+char SccsId[]= "dver.c 1.13 84/03/16";
int output = 0; /* do we do output at all? */
int nolist = 0; /* output page list if > 0 */
int olist[20]; /* pairs of page numbers */
int output = 0; /* do we do output at all? */
int nolist = 0; /* output page list if > 0 */
int olist[20]; /* pairs of page numbers */
-int spage = 9999; /* stop every spage pages */
-int scount = 0;
struct dev dev;
struct font *fontbase[NFONTS+1];
short * pstab; /* point size table pointer */
struct dev dev;
struct font *fontbase[NFONTS+1];
short * pstab; /* point size table pointer */
if (dbg == 0) dbg = 1;
break;
#endif
if (dbg == 0) dbg = 1;
break;
#endif
- case 's':
- spage = atoi(operand(&argc, &argv));
- if (spage <= 0)
- spage = 9999;
- break;
while ((c = getc(fp)) != EOF) {
switch (c) {
case '\n': /* when input is text */
while ((c = getc(fp)) != EOF) {
switch (c) {
case '\n': /* when input is text */
case 0: /* occasional noise creeps in */
case 0: /* occasional noise creeps in */
break;
case '{': /* push down current environment */
t_push();
break;
case '{': /* push down current environment */
t_push();
put1s(str);
break;
case 't': /* straight text */
put1s(str);
break;
case 't': /* straight text */
- (void) fgets(buf, sizeof(buf), fp);
+ if (fgets(buf, sizeof(buf), fp) == NULL)
+ error(FATAL, "unexpected end of input");
t_text(buf);
break;
case 'D': /* draw function */
t_text(buf);
break;
case 'D': /* draw function */
- (void) fgets(buf, sizeof(buf), fp);
+ if (fgets(buf, sizeof(buf), fp) == NULL)
+ error(FATAL, "unexpected end of input");
switch (buf[0]) {
case 'l': /* draw a line */
sscanf(buf+1, "%d %d", &n, &m);
switch (buf[0]) {
case 'l': /* draw a line */
sscanf(buf+1, "%d %d", &n, &m);
- fscanf(fp, "%d", &n); /* ignore fractional sizes */
setsize(t_size(n));
break;
case 'f':
setsize(t_size(n));
break;
case 'f':
setfont(t_font(str));
break;
case 'H': /* absolute horizontal motion */
setfont(t_font(str));
break;
case 'H': /* absolute horizontal motion */
- /* fscanf(fp, "%d", &n); */
while ((c = getc(fp)) == ' ')
;
k = 0;
while ((c = getc(fp)) == ' ')
;
k = 0;
t_page(n);
break;
case 'n': /* end of line */
t_page(n);
break;
case 'n': /* end of line */
- while (getc(fp) != '\n')
- ;
- while (getc(fp) != '\n')
- ;
+ do
+ c = getc(fp);
+ while (c != '\n' && c != EOF);
break;
case 'x': /* device control */
if (devcntrl(fp)) return;
break;
case 'x': /* device control */
if (devcntrl(fp)) return;
register int outsize;
if (page == PAGEEND) { /* set outsize to inch boundary */
register int outsize;
if (page == PAGEEND) { /* set outsize to inch boundary */
- outsize = (maxv + (RES - 1) - pagelen) / RES;
+ outsize = (maxv + (RES - 2) - pagelen) / RES;
vorigin = pagelen = 0; /* reset for new page */
if (outsize < 1) return; /* if outsize <= zero, forget it */
vorigin = pagelen = 0; /* reset for new page */
if (outsize < 1) return; /* if outsize <= zero, forget it */
- outsize *= RES * BYTES_PER_LINE; /* are assured that outsize */
- vwrite(buf0p, outsize); /* will NOT be > BUFFER_SIZE */
- vclear(buf0p, outsize); /* since vsort makes sure of */
- } else { /* putting P commands in */
+ outsize *= RES * BYTES_PER_LINE;
+ vwrite(buf0p, outsize > BUFFER_SIZE ? BUFFER_SIZE : outsize);
+ vclear(buf0p, BUFFER_SIZE);
+ while ((outsize -= BUFFER_SIZE) > 0)
+ vwrite(buf0p, outsize > BUFFER_SIZE ? BUFFER_SIZE : outsize);
+ } else {
vorigin += NLINES;
pagelen += NLINES;
vwrite(buf0p, BUFFER_SIZE);
vorigin += NLINES;
pagelen += NLINES;
vwrite(buf0p, BUFFER_SIZE);
- if (vpos > maxv) maxv = vpos;
register int i; /* loop counter */
register int count; /* font data ptr */
register unsigned fontdata; /* font data temporary */
register int i; /* loop counter */
register int count; /* font data ptr */
register unsigned fontdata; /* font data temporary */
- register int off8; /* offset + 8 */
+ register int off8; /* reverse of offset */
if (fontwanted)
if (getfont()) return;
if (fontwanted)
if (getfont()) return;
scanp = buf0p + (vpos - (vorigin + dis->up)) * BYTES_PER_LINE
+ (hpos - dis->left) / 8;
scanp_inc = BYTES_PER_LINE - llen;
scanp = buf0p + (vpos - (vorigin + dis->up)) * BYTES_PER_LINE
+ (hpos - dis->left) / 8;
scanp_inc = BYTES_PER_LINE - llen;
- offset = - ((hpos - dis->left) &07);
- off8 = offset + 8;
+ offset = (hpos - dis->left) &07;
+ off8 = 8 - offset;
for (i = 0; i < nlines; i++) {
if ((unsigned) (scanp + (count = llen)) > (unsigned) BUFBOTTOM)
return;
for (i = 0; i < nlines; i++) {
if ((unsigned) (scanp + (count = llen)) > (unsigned) BUFBOTTOM)
return;
addr += 4;
if (count < 4)
fontdata &= ~strim[count];
addr += 4;
if (count < 4)
fontdata &= ~strim[count];
- *(unsigned*)scanp |=(fontdata << offset) & ~M[off8];
+ *(unsigned*)scanp |=(fontdata >> offset) & ~M[off8];
scanp++;
*(unsigned*)scanp |=(fontdata << off8) & ~N[off8];
scanp += 3;
scanp++;
*(unsigned*)scanp |=(fontdata << off8) & ~N[off8];
scanp += 3;
* it is left out. Things outside the x boundary are wrapped around the end.
*/
point(x, y)
* it is left out. Things outside the x boundary are wrapped around the end.
*/
point(x, y)
+register int x;
+register int y;
{
register char *ptr = buf0p + (y - vorigin) * BYTES_PER_LINE + (x >> 3);
{
register char *ptr = buf0p + (y - vorigin) * BYTES_PER_LINE + (x >> 3);
- if (ptr <= BUFBOTTOM && ptr >= BUFTOP) /* ignore it if it wraps over */
- *ptr |= 1 << (7 - (x & 07));
+ if (ptr > BUFBOTTOM || ptr < BUFTOP) /* ignore if it's off buffer */
+ return;
+
+ *ptr |= 1 << (7 - (x & 07));
+ if (y > maxv) maxv = y;