summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvipsk/dosection.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/dvipsk/dosection.c')
-rw-r--r--Build/source/texk/dvipsk/dosection.c293
1 files changed, 293 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..f93fde5eafe
--- /dev/null
+++ b/Build/source/texk/dvipsk/dosection.c
@@ -0,0 +1,293 @@
+/*
+ * Code to output PostScript commands for one section of the document.
+ */
+#include "dvips.h" /* The copyright notice in that file is included too! */
+/*
+ * The external declarations:
+ */
+#include "protos.h"
+
+static int psfont;
+#ifdef HPS
+int pagecounter;
+#endif
+
+/*
+ * Now we have the main procedure.
+ */
+void
+dosection(sectiontype *s, int c)
+{
+ charusetype *cu;
+ integer prevptr;
+ int np;
+ int k;
+ integer thispage = 0;
+ char buf[300]; /* really 253 */
+
+ bmenc_startsection() ;
+ 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);
+ /* possibly lines in eps files are supposed to be <= 255;
+ not worth testing the limits merely to output a long file name. */
+ snprintf(buf, sizeof(buf), "(%.250s)", fulliname);
+ cmdout(buf);
+ newline();
+ 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)
+ fseek(dvifile, (long)prevptr, 0);
+ np = s->numpages;
+ while (np-- != 0) {
+ if (reverse)
+ 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
+ fprintf(stderr, "[%ld", pagenum);
+#else /* ~SHORTINT */
+ fprintf(stderr, "[%d", pagenum);
+#endif /* ~SHORTINT */
+ fflush(stderr);
+ }
+ skipover(36);
+ prevptr = signedquad()+1;
+ for (k=0; k<pagecopies; k++) {
+ if (k == 0) {
+ if (pagecopies > 1)
+ thispage = ftell(dvifile);
+ } else {
+ fseek(dvifile, (long)thispage, 0);
+ if (prettycolumn + 1 > STDOUTSIZE) {
+ fprintf(stderr, "\n");
+ prettycolumn = 0;
+ }
+ fprintf(stderr, ".");
+ fflush(stderr);
+ prettycolumn++;
+ }
+ dopage();
+ }
+ if (! quiet) {
+ fprintf(stderr, "] ");
+ fflush(stderr);
+ prettycolumn += 2;
+ }
+ if (! reverse)
+ skipnop();
+ }
+ }
+ if (! multiplesects && ! disablecomments) {
+ newline();
+ fprintf(bitfile, "%%%%Trailer\n");
+ }
+ if (multiplesects) {
+ if (! disablecomments) {
+ newline();
+ fprintf(bitfile, "%%DVIPSSectionTrailer\n");
+ }
+ cmdout("eos");
+ cmdout("end");
+ }
+#ifdef HPS
+ if (HPS_FLAG) cmdout("\nend"); /* close off HPSDict */
+#endif
+ if (multiplesects && ! disablecomments) {
+ newline();
+ 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(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;
+}
+
+static void
+InstallPL(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(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
+}