summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Breitenlohner <peb@mppmu.mpg.de>2013-11-20 10:57:01 +0000
committerPeter Breitenlohner <peb@mppmu.mpg.de>2013-11-20 10:57:01 +0000
commit695d20df01561e83122b87ddadad734195c6b9c8 (patch)
treecca1a283f6060b1d13725fd9015a84d6adbae835
parent0fa20c33bf4ee9968010daae8c8c7607c3e1b39f (diff)
seetexk (dviselect): Delay output until a page is selected
git-svn-id: svn://tug.org/texlive/trunk@32191 c570f23f-e606-0410-a88d-b1316a301751
-rw-r--r--Build/source/texk/seetexk/ChangeLog7
-rw-r--r--Build/source/texk/seetexk/dviconcat.c1
-rw-r--r--Build/source/texk/seetexk/dviselect.c67
-rwxr-xr-xBuild/source/texk/seetexk/seetexk.test21
4 files changed, 74 insertions, 22 deletions
diff --git a/Build/source/texk/seetexk/ChangeLog b/Build/source/texk/seetexk/ChangeLog
index cb25ae24c0d..6d1344631af 100644
--- a/Build/source/texk/seetexk/ChangeLog
+++ b/Build/source/texk/seetexk/ChangeLog
@@ -1,3 +1,10 @@
+2013-11-20 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * dviselect.c: Delay opening output until a page is selected.
+ * seetexk.test: More tests with stdin and stdout.
+
+ * dviconcat.c: Drop '#include <kpathsea/c-auto.h>'.
+
2013-11-18 Akira Kakuto <kakuto@fuk.kindai.ac.jp>
* dvibook.c, dviconcat.c, dviselect.c, dvitodvi.c, tempfile.c:
diff --git a/Build/source/texk/seetexk/dviconcat.c b/Build/source/texk/seetexk/dviconcat.c
index 3f4dda2d354..d776e57a3b5 100644
--- a/Build/source/texk/seetexk/dviconcat.c
+++ b/Build/source/texk/seetexk/dviconcat.c
@@ -29,7 +29,6 @@
#endif
#ifdef KPATHSEA
-#include <kpathsea/c-auto.h>
#include <kpathsea/config.h>
#include <kpathsea/c-fopen.h>
#include <kpathsea/getopt.h>
diff --git a/Build/source/texk/seetexk/dviselect.c b/Build/source/texk/seetexk/dviselect.c
index efa6cb96f5b..6e55ab7a330 100644
--- a/Build/source/texk/seetexk/dviselect.c
+++ b/Build/source/texk/seetexk/dviselect.c
@@ -133,9 +133,10 @@ i32 OutputFontIndex; /* current (new) index in ouput */
struct pagelist *PageList; /* the list of allowed pages */
-const char *DVIFileName; /* name of input DVI file */
-FILE *inf; /* the input file itself */
-FILE *outf; /* the output DVI file */
+const char *DVIFileName; /* name of input DVI file */
+FILE *inf; /* the input file itself */
+const char *outname; /* name of output DVI file */
+FILE *outf; /* the output DVI file */
long StartOfLastPage; /* The file position just before we started
the last page (this is later written to
@@ -163,6 +164,7 @@ static int evenodd(char *);
static int ParsePages(char *);
static void HandleDVIFile(void);
static void PutFontSelector(i32);
+static void WritePreAmble(void);
#ifndef KPATHSEA
char *malloc(), *realloc();
@@ -282,6 +284,9 @@ BeginPage(void)
if ((UseThisPage = DesiredPageP()) == 0)
return;
+ if (NumberOfOutputPages == 0)
+ WritePreAmble();
+
putbyte(outf, DVI_BOP);
for (i = Count; i < &Count[10]; i++)
PutLong(outf, *i);
@@ -349,6 +354,9 @@ HandlePostAmble(void)
{
register i32 c;
+ if (NumberOfOutputPages == 0)
+ return;
+
(void) GetLong(inf); /* previous page pointer */
if (GetLong(inf) != Numerator)
GripeMismatchedValue("numerator");
@@ -441,12 +449,18 @@ WriteFont(struct fontinfo *fi)
}
/*
- * Handle the preamble. Someday we should update the comment field.
+ * Array to hold the preamble comment.
+ */
+static char PreComment[256];
+
+/*
+ * Read the preamble. Someday we should update the comment field.
*/
static void
-HandlePreAmble(void)
+ReadPreAmble(void)
{
register int n, c;
+ char *comment = PreComment;
c = getc(inf);
if (c == EOF)
@@ -459,17 +473,43 @@ HandlePreAmble(void)
Numerator = GetLong(inf);
Denominator = GetLong(inf);
DVIMag = GetLong(inf);
+ c = GetByte(inf);
+ n = UnSign8(c);
+ *comment++ = (char)c;
+ while (--n >= 0) {
+ c = GetByte(inf);
+ *comment++ = (char)c;
+ }
+}
+
+/*
+ * Open the output and write the preamble.
+ */
+static void
+WritePreAmble(void)
+{
+ register int n, c;
+ char *comment = PreComment;
+
+ if (outname == NULL) {
+ outf = stdout;
+ if (!isatty(fileno(outf)))
+ SET_BINARY(fileno(outf));
+ } else if ((outf = fopen(outname, FOPEN_WBIN_MODE)) == 0)
+ error(1, -1, "cannot write %s", outname);
+
putbyte(outf, DVI_PRE);
putbyte(outf, DVI_VERSION);
PutLong(outf, Numerator);
PutLong(outf, Denominator);
PutLong(outf, DVIMag);
- n = UnSign8(GetByte(inf));
+ c = *comment++;
+ n = UnSign8(c);
CurrentPosition = 15 + n; /* well, almost */
putbyte(outf, n);
while (--n >= 0) {
- c = GetByte(inf);
+ c = *comment++;
putbyte(outf, c);
}
}
@@ -479,7 +519,6 @@ main(int argc, char **argv)
{
register int c;
register char *s;
- char *outname = NULL;
ProgName = *argv;
setbuf(stderr, serrbuf);
@@ -538,18 +577,12 @@ Usage: %s [-s] [-i infile] [-o outfile] pages [...] [infile [outfile]]\n",
SET_BINARY(fileno(inf));
} else if ((inf = fopen(DVIFileName, FOPEN_RBIN_MODE)) == 0)
error(1, -1, "cannot read %s", DVIFileName);
- if (outname == NULL) {
- outf = stdout;
- if (!isatty(fileno(outf)))
- SET_BINARY(fileno(outf));
- } else if ((outf = fopen(outname, FOPEN_WBIN_MODE)) == 0)
- error(1, -1, "cannot write %s", outname);
if ((FontFinder = SCreate(sizeof(struct fontinfo))) == 0)
error(1, 0, "cannot create font finder (out of memory?)");
StartOfLastPage = -1;
- HandlePreAmble();
+ ReadPreAmble();
HandleDVIFile();
HandlePostAmble();
if (NumberOfOutputPages > 0) {
@@ -561,10 +594,6 @@ Usage: %s [-s] [-i infile] [-o outfile] pages [...] [infile [outfile]]\n",
} else {
if (!SFlag)
(void) fprintf(stderr, "Specified page may be out of range\n");
- if (outname) {
- fclose (outf);
- unlink (outname);
- }
return 1;
}
}
diff --git a/Build/source/texk/seetexk/seetexk.test b/Build/source/texk/seetexk/seetexk.test
index 41abfb8c576..af3c7d011ae 100755
--- a/Build/source/texk/seetexk/seetexk.test
+++ b/Build/source/texk/seetexk/seetexk.test
@@ -26,6 +26,23 @@ rm -rf play*
echo dviselect tests OK
+rm -rf play*
+cat $srcdir/tests/play.dvi | ./dviselect =25 >playsel.dvi \
+ 2>playsel.2 \
+ && exit 1
+ touch playnot.dvi \
+ && diff playsel.dvi playnot.dvi \
+ && diff playsel.2 $srcdir/tests/playnot.2 \
+ || exit 1
+
+rm -rf play*
+cat $srcdir/tests/play.dvi | ./dviselect =5:15 >playsel.dvi \
+ 2>playsel.2 \
+ && diff playsel.2 $srcdir/tests/playsel.2 \
+ || exit 1
+
+echo dviselect with stdin and stdout tests OK
+
./dvibook -s4 playsel.dvi playbook.dvi \
2>playbook.2 \
&& diff playbook.2 $srcdir/tests/playbook.2 \
@@ -35,12 +52,12 @@ echo dvibook tests OK
rm -f playbook.2
-cat playsel.dvi | ./dvibook -s4 -o playbook.dvi \
+cat playsel.dvi | ./dvibook -s4 >playbook.dvi \
2>playbook.2 \
&& diff playbook.2 $srcdir/tests/playbook.2 \
|| exit 1
-echo dvibook reading stdin tests OK
+echo dvibook with stdin and stdout tests OK
./dviselect =5:7 $srcdir/tests/play.dvi playsel1.dvi \
2>playconc.2 \