diff options
author | Karl Berry <karl@freefriends.org> | 2006-01-17 21:41:51 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2006-01-17 21:41:51 +0000 |
commit | 487ca4806cc046076293cf6cc5fbba0db282bac7 (patch) | |
tree | 847b412ab5158dd7bdd7ed7e5a4cc3fbca94be32 /Build/source/texk/dvipsk/dosection.c | |
parent | a3d3111bfe26b8e5f5bc6049dfb2a4ca2edc7881 (diff) |
texk 1
git-svn-id: svn://tug.org/texlive/trunk@1485 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/dvipsk/dosection.c')
-rw-r--r-- | Build/source/texk/dvipsk/dosection.c | 306 |
1 files changed, 306 insertions, 0 deletions
diff --git a/Build/source/texk/dvipsk/dosection.c b/Build/source/texk/dvipsk/dosection.c new file mode 100644 index 00000000000..82d2e2134bc --- /dev/null +++ b/Build/source/texk/dvipsk/dosection.c @@ -0,0 +1,306 @@ +/* + * Code to output PostScript commands for one section of the document. + */ +#include "dvips.h" /* The copyright notice in that file is included too! */ +/* + * These are the external routines we call. + */ +#include "protos.h" + +/* + * These are the external variables we access. + */ +extern shalfword linepos ; +extern FILE *dvifile ; +extern FILE *bitfile ; +extern integer pagenum ; +extern long bytesleft ; +extern quarterword *raster ; +extern int quiet ; +extern Boolean reverse, multiplesects, disablecomments ; +extern Boolean evenpages, oddpages, pagelist ; +extern int actualdpi ; +extern int vactualdpi ; +extern int prettycolumn ; +extern integer hpapersize, vpapersize ; +extern integer pagecopies ; +static int psfont ; +extern double mag ; +extern char *fulliname ; +#ifdef HPS +int pagecounter ; +extern Boolean HPS_FLAG ; +#endif +/* + * Now we have the main procedure. + */ +void +dosection P2C(sectiontype *, s, int, c) +{ + charusetype *cu ; + integer prevptr ; + int np ; + int k ; + integer thispage = 0 ; + char buf[104]; + + dopsfont(s) ; +#ifdef HPS + if (HPS_FLAG) pagecounter = 0; +#endif + + if (multiplesects) { + setup() ; + } + cmdout("TeXDict") ; + cmdout("begin") ; + numout(hpapersize) ; + numout(vpapersize) ; + doubleout(mag) ; + numout((integer)DPI) ; + numout((integer)VDPI) ; + sprintf(buf, "(%.99s)", fulliname) ; + cmdout(buf) ; + cmdout("@start") ; + if (multiplesects) + cmdout("bos") ; +/* + * We insure raster is even-word aligned, because download might want that. + */ + if (bytesleft & 1) { + bytesleft-- ; + raster++ ; + } + cleanres() ; + cu = (charusetype *) (s + 1) ; + psfont = 1 ; + while (cu->fd) { + if (cu->psfused) + cu->fd->psflag = EXISTS ; + download(cu++, psfont++) ; + } + fonttableout() ; + if (! multiplesects) { + cmdout("end") ; + setup() ; + } + for (cu=(charusetype *)(s+1); cu->fd; cu++) + cu->fd->psflag = 0 ; + while (c > 0) { + c-- ; + prevptr = s->bos ; + if (! reverse) + (void)fseek(dvifile, (long)prevptr, 0) ; + np = s->numpages ; + while (np-- != 0) { + if (reverse) + (void)fseek(dvifile, (long)prevptr, 0) ; + pagenum = signedquad() ; + if ((evenpages && (pagenum & 1)) || (oddpages && (pagenum & 1)==0) || + (pagelist && !InPageList(pagenum))) { + if (reverse) { + skipover(36) ; + prevptr = signedquad()+1 ; + } else { + skipover(40) ; + skippage() ; + skipnop() ; + } + ++np ; /* this page wasn't counted for s->numpages */ + continue; + } +/* + * We want to take the base 10 log of the number. It's probably + * small, so we do it quick. + */ + if (! quiet) { + int t = pagenum, i = 0 ; + if (t < 0) { + t = -t ; + i++ ; + } + do { + i++ ; + t /= 10 ; + } while (t > 0) ; + if (pagecopies < 20) + i += pagecopies - 1 ; + if (i + prettycolumn > STDOUTSIZE) { + fprintf(stderr, "\n") ; + prettycolumn = 0 ; + } + prettycolumn += i + 1 ; +#ifdef SHORTINT + (void)fprintf(stderr, "[%ld", pagenum) ; +#else /* ~SHORTINT */ + (void)fprintf(stderr, "[%d", pagenum) ; +#endif /* ~SHORTINT */ + (void)fflush(stderr) ; + } + skipover(36) ; + prevptr = signedquad()+1 ; + for (k=0; k<pagecopies; k++) { + if (k == 0) { + if (pagecopies > 1) + thispage = ftell(dvifile) ; + } else { + (void)fseek(dvifile, (long)thispage, 0) ; + if (prettycolumn + 1 > STDOUTSIZE) { + (void)fprintf(stderr, "\n") ; + prettycolumn = 0 ; + } + (void)fprintf(stderr, ".") ; + (void)fflush(stderr) ; + prettycolumn++ ; + } + dopage() ; + } + if (! quiet) { + (void)fprintf(stderr, "] ") ; + (void)fflush(stderr) ; + prettycolumn += 2 ; + } + if (! reverse) + (void)skipnop() ; + } + } + if (! multiplesects && ! disablecomments) { + newline() ; + (void)fprintf(bitfile, "%%%%Trailer\n") ; + } + if (multiplesects) { + if (! disablecomments) { + newline() ; + (void)fprintf(bitfile, "%%DVIPSSectionTrailer\n") ; + } + cmdout("eos") ; + cmdout("end") ; + } +#ifdef HPS + if (HPS_FLAG) cmdout("\nend") ; /* close off HPSDict */ +#endif + if (multiplesects && ! disablecomments) { + newline() ; + (void)fprintf(bitfile, "%%DVIPSEndSection\n") ; + linepos = 0 ; + } +} +/* + * Handle a list of pages for dvips. Code based on dvi2ps 2.49, + * maintained by Piet van Oostrum, piet@cs.ruu.nl. Collected and + * modularized for inclusion in dvips by metcalf@lcs.mit.edu. + */ + +#include <ctype.h> +#define MAXPAGE (1000000000) /* assume no pages out of this range */ +struct p_list_str { + struct p_list_str *next; /* next in a series of alternates */ + integer ps_low, ps_high; /* allowed range */ +} *ppages = 0; /* the list of allowed pages */ + +/*-->InPageList*/ +/**********************************************************************/ +/****************************** InPageList **************************/ +/**********************************************************************/ +/* Return true iff i is one of the desired output pages */ + +int InPageList P1C(integer, i) +{ + register struct p_list_str *pl = ppages; + + while (pl) { + if ( i >= pl -> ps_low && i <= pl -> ps_high) + return 1; /* success */ + pl = pl -> next; + } + return 0; +} + +void InstallPL P2C(integer, pslow, integer, pshigh) +{ + register struct p_list_str *pl; + + pl = (struct p_list_str *)mymalloc((integer)(sizeof *pl)); + pl -> next = ppages; + pl -> ps_low = pslow; + pl -> ps_high = pshigh; + ppages = pl; +} + +/* Parse a string representing a list of pages. Return 0 iff ok. As a + side effect, the page selection(s) is (are) prepended to ppages. */ + +int +ParsePages P1C(register char *, s) +{ + register int c ; /* current character */ + register integer n = 0, /* current numeric value */ + innumber; /* true => gathering a number */ + integer ps_low = 0, ps_high = 0 ; + int range, /* true => saw a range indicator */ + negative = 0; /* true => number being built is negative */ + +#define white(x) ((x) == ' ' || (x) == '\t' || (x) == ',') + + range = 0; + innumber = 0; + for (;;) { + c = *s++; + if ( !innumber && !range) {/* nothing special going on */ + if (c == 0) + return 0; + if (white (c)) + continue; + } + if (c == '-' && !innumber) { + innumber++; + negative++; + n = 0; + continue; + } + if ('0' <= c && c <= '9') { /* accumulate numeric value */ + if (!innumber) { + innumber++; + negative = 0; + n = c - '0'; + continue; + } + n *= 10; + n += negative ? '0' - c : c - '0'; + continue; + } + if (c == '-' || c == ':') {/* here's a range */ + if (range) + return (-1); + if (innumber) { /* have a lower bound */ + ps_low = n; + } + else + ps_low = -MAXPAGE; + range++; + innumber = 0; + continue; + } + if (c == 0 || white (c)) {/* end of this range */ + if (!innumber) { /* no upper bound */ + ps_high = MAXPAGE; + if (!range) /* no lower bound either */ + ps_low = -MAXPAGE; + } + else { /* have an upper bound */ + ps_high = n; + if (!range) { /* no range => lower bound == upper */ + ps_low = ps_high; + } + } + InstallPL (ps_low, ps_high); + if (c == 0) + return 0; + range = 0; + innumber = 0; + continue; + } + return (-1); + } +#undef white +} |