diff options
Diffstat (limited to 'dviware/beebe/src/prtpage.h')
-rw-r--r-- | dviware/beebe/src/prtpage.h | 299 |
1 files changed, 299 insertions, 0 deletions
diff --git a/dviware/beebe/src/prtpage.h b/dviware/beebe/src/prtpage.h new file mode 100644 index 0000000000..3be15061d5 --- /dev/null +++ b/dviware/beebe/src/prtpage.h @@ -0,0 +1,299 @@ +/* -*-C-*- prtpage.h */ +/*-->prtpage*/ +/**********************************************************************/ +/****************************** prtpage *******************************/ +/**********************************************************************/ + +void +prtpage(bytepos) /* print page whose BOP is at bytepos */ +long bytepos; + +{ + struct stack_entry + { + INT32 h; + COORDINATE hh; + INT32 v; + COORDINATE vv; + INT32 w, x, y, z; /* what's on stack */ + }; + register BYTE command; /* current command */ + register INT16 i; /* command parameter; loop index */ + char tc; /* temporary character */ + UNSIGN32 ht_rule; /* rule height */ + UNSIGN32 wd_rule; /* rule width */ + INT32 k,m; /* temporary parameter */ + BOOLEAN seen_bop; /* flag for noting processing of BOP */ + register INT16 sp; /* stack pointer */ + struct stack_entry stack[STACKSIZE]; /* stack */ + char specstr[MAXSPECIAL+1]; /* \special{} string */ + INT32 w; /* current horizontal spacing */ + INT32 x; /* current horizontal spacing */ + INT32 y; /* current vertical spacing */ + INT32 z; /* current vertical spacing */ + +/*********************************************************************** +Process all commands between the BOP at bytepos and the next BOP or +POST. The page is printed when the EOP is met, but font changes can +also happen between EOP and BOP, so we have to keep going after EOP. +***********************************************************************/ + + seen_bop = FALSE; /* this is first time through */ + (void) FSEEK(dvifp,bytepos,0); /* start at the desired position */ + + for (;;) /* "infinite" loop - exits when POST or second BOP met */ + { +#if BBNBITGRAPH + /* If the test here on every byte proves to carry objectionable + overhead, it can be moved into the default, PUTx, and SETx + command sections. The goal is to give the user instant + response in page screen positioning, without having to wait + for the entire screen to be painted when it is just going + to be moved anyway. This is the sort of display algorithm + that EMACS uses. */ + if (kbinput() > 0) /* user has typed something */ + command = EOP; /* so set for end-of-page action */ + else +#endif + command = (BYTE)nosignex(dvifp,(BYTE)1); + switch (command) + { + + case SET1: + case SET2: + case SET3: + case SET4: + (void)setchar((BYTE)nosignex(dvifp,(BYTE)(command-SET1+1)),TRUE); + break; + + case SET_RULE: + ht_rule = nosignex(dvifp,(BYTE)4); + wd_rule = nosignex(dvifp,(BYTE)4); + (void)setrule(ht_rule,wd_rule,TRUE); + break; + + case PUT1: + case PUT2: + case PUT3: + case PUT4: + (void)setchar((BYTE)nosignex(dvifp,(BYTE)(command-PUT1+1)),FALSE); + break; + + case PUT_RULE: + ht_rule = nosignex(dvifp,(BYTE)4); + wd_rule = nosignex(dvifp,(BYTE)4); + (void)setrule(ht_rule,wd_rule,FALSE); + break; + + case NOP: + break; + + case BOP: + if (seen_bop) + return; /* we have been here already */ + seen_bop = TRUE; + + for (i=0; i<=9; i++) + tex_counter[i] = (INT32)signex(dvifp,(BYTE)4); + +#if BBNBITGRAPH + (void)bopact(); /* display menu at top of page */ +#else /* not BBNBITGRAPH */ + +#if (CANON_A2 | HPJETPLUS | IMPRESS | POSTSCRIPT) + (void)bopact(); +#else /* NOT (CANON_A2 | HPJETPLUS | IMPRESS | POSTSCRIPT) */ + (void)clrbmap(); +#endif /* (CANON_A2 | HPJETPLUS | IMPRESS | POSTSCRIPT) */ + + if (!quiet) + (void)fprintf(stderr,"{%s}",tctos()); /* TeX page counters */ + (void) nosignex(dvifp,(BYTE)4); /* skip prev. page ptr */ +#endif /* BBNBITGRAPH */ + + h = v = w = x = y = z = 0; + hh = lmargin; + vv = tmargin; + sp = 0; + fontptr = (struct font_entry*)NULL; + break; + + case EOP: + +#if (BBNBITGRAPH | CANON_A2 | HPJETPLUS | IMPRESS | POSTSCRIPT) + (void)eopact(); +#else + (void)prtbmap(); +#endif /* (BBNBITGRAPH | CANON_A2 | HPJETPLUS | IMPRESS | POSTSCRIPT) */ + + return; + + case PUSH: + if (sp >= STACKSIZE) + (void)fatal("prtpage(): stack overflow"); + stack[sp].h = h; + stack[sp].hh = hh; + stack[sp].v = v; + stack[sp].vv = vv; + stack[sp].w = w; + stack[sp].x = x; + stack[sp].y = y; + stack[sp].z = z; + sp++; + break; + + case POP: + --sp; + if (sp < 0) + (void)fatal("prtpage(): stack underflow"); + h = stack[sp].h; + hh = stack[sp].hh; + v = stack[sp].v; + vv = stack[sp].vv; + w = stack[sp].w; + x = stack[sp].x; + y = stack[sp].y; + z = stack[sp].z; + break; + + case RIGHT1: + case RIGHT2: + case RIGHT3: + case RIGHT4: + (void)moveover(signex(dvifp,(BYTE)(command-RIGHT1+1))); + break; + + case W0: + (void)moveover(w); + break; + + case W1: + case W2: + case W3: + case W4: + w = (INT32)signex(dvifp,(BYTE)(command-W1+1)); + (void)moveover(w); + break; + + case X0: + (void)moveover(x); + break; + + case X1: + case X2: + case X3: + case X4: + x = (INT32)signex(dvifp,(BYTE)(command-X1+1)); + (void)moveover(x); + break; + + case DOWN1: + case DOWN2: + case DOWN3: + case DOWN4: + (void)movedown(signex(dvifp,(BYTE)(command-DOWN1+1))); + break; + + case Y0: + (void)movedown(y); + break; + + case Y1: + case Y2: + case Y3: + case Y4: + y = signex(dvifp,(BYTE)(command-Y1+1)); + (void)movedown(y); + break; + + case Z0: + (void)movedown(z); + break; + + case Z1: + case Z2: + case Z3: + case Z4: + z = signex(dvifp,(BYTE)(command-Z1+1)); + (void)movedown(z); + break; + + case FNT1: + case FNT2: + case FNT3: + case FNT4: + (void)setfntnm((INT32)nosignex(dvifp, + (BYTE)(command-FNT1+1))); + break; + + case XXX1: + case XXX2: + case XXX3: + case XXX4: + k = (INT32)nosignex(dvifp,(BYTE)(command-XXX1+1)); + if (k > MAXSPECIAL) + { + (void)sprintf(message, + "prtpage(): \\special{} string of %d characters longer \ +than DVI driver limit of %d -- truncated.", + k,MAXSPECIAL); + (void)warning(message); + } + m = 0; + while (k--) + { + tc = (char)nosignex(dvifp,(BYTE)1); + if (m < MAXSPECIAL) + specstr[m++] = tc; + } + specstr[m] = '\0'; + (void) special(specstr); + break; + + case FNT_DEF1: + case FNT_DEF2: + case FNT_DEF3: + case FNT_DEF4: + if (preload) + (void)skipfont ((INT32) nosignex(dvifp, + (BYTE)(command-FNT_DEF1+1))); + else + (void)readfont ((INT32) nosignex(dvifp, + (BYTE)(command-FNT_DEF1+1))); + break; + + case PRE: + (void)fatal("prtpage(): PRE occurs within file"); + break; + + case POST: + (void)devterm(); /* terminate device output */ + (void)dviterm(); /* terminate DVI file processing */ + (void)alldone(); /* this will never return */ + break; + + case POST_POST: + (void)fatal("prtpage(): POST_POST with no preceding POST"); + break; + + default: + if (command >= FONT_00 && command <= FONT_63) + (void)setfntnm((INT32)(command - FONT_00)); + else if (command >= SETC_000 && command <= SETC_127) + +#if (HPJETPLUS | POSTSCRIPT | IMPRESS | CANON_A2) + (void)setstr((BYTE)command); /* this sets several chars */ +#else + (void)setchar((BYTE)(command-SETC_000), TRUE); +#endif /* (HPJETPLUS | POSTSCRIPT | IMPRESS | CANON_A2) */ + + else + { + (void)sprintf(message,"prtpage(): %d is an undefined command", + command); + (void)fatal(message); + } + break; + } + } +} |