diff --git a/srcpkgs/psutils/patches/psutils.patch b/srcpkgs/psutils/patches/psutils.patch new file mode 100644 index 00000000000..ef6e6192854 --- /dev/null +++ b/srcpkgs/psutils/patches/psutils.patch @@ -0,0 +1,2518 @@ +diff -rupN psutils/Makefile.unix psutils-new/Makefile.unix +--- psutils/Makefile.unix 1997-03-11 23:52:59.000000000 +0100 ++++ psutils-new/Makefile.unix 2014-04-11 15:51:34.758134445 +0200 +@@ -5,6 +5,14 @@ + # + # updated AJCD 3/1/96 + # ++# patched by some patches from debian ++# conditional patch for libpaper by ++# Dormeletti Carlo ++# ++# if you want compile it with libpaper support ++# uncomment the LIBPAPER line, any value will make the test true ++# and compile it with libpaper support ++# + # Multiple makefiles for different OSes are generated from a single master + # now. + # +@@ -19,16 +27,19 @@ + # psnup puts multiple logical pages on one physical page + # psresize scales and moves pages to fit on different paper sizes + ++# LIBPAPER = true ++ + PAPER=a4 + + # Makefile for PSUtils under Unix + + OS = UNIX +- +-BINDIR = /usr/local/bin ++prefix=/usr ++ ++BINDIR = $(prefix)/bin + SCRIPTDIR = $(BINDIR) +-INCLUDEDIR = /usr/local/share/psutils +-PERL = /usr/local/bin/perl ++INCLUDEDIR = $(prefix)/share/psutils ++PERL = /usr/bin/perl + + BINMODE = 0755 + MANMODE = 0644 +@@ -36,23 +47,30 @@ CHMOD = chmod + INSTALL = install -c -m $(BINMODE) + INSTALLMAN = install -c -m $(MANMODE) + MANEXT = 1 +-MANDIR = /usr/local/share/man/man$(MANEXT) ++MANDIR = $(prefix)/share/man/man$(MANEXT) + + CC = gcc +-CFLAGS = -DPAPER=\"$(PAPER)\" -DUNIX -O -Wall + +-BIN = psbook psselect pstops epsffit psnup \ +- psresize +-SHELLSCRIPTS = getafm showchar +-PERLSCRIPTS = fixfmps fixmacps fixpsditps fixpspps \ ++ifdef LIBPAPER ++ CFLAGS = -DDEBIAN -DUNIX -O2 -g -Wall -Werror ++ LIBS = -lpaper ++else ++ CFLAGS = -DPAPER=\"$(PAPER)\" -DUNIX -O2 -g -Wall -Werror ++ LIBS = ++endif ++ ++ ++BIN = psbook psselect pstops epsffit psnup psresize ++SHELLSCRIPTS = getafm showchar psjoin ++PERLSCRIPTS = fixfmps fixpsditps fixpspps \ + fixtpps fixwfwps fixwpps fixscribeps fixwwps \ + fixdlsrps extractres includeres psmerge + MANPAGES = psbook.$(MANEXT) psselect.$(MANEXT) pstops.$(MANEXT) epsffit.$(MANEXT) psnup.$(MANEXT) \ +- psresize.$(MANEXT) psmerge.$(MANEXT) fixscribeps.$(MANEXT) getafm.$(MANEXT) \ +- fixdlsrps.$(MANEXT) fixfmps.$(MANEXT) fixmacps.$(MANEXT) fixpsditps.$(MANEXT) \ ++ psresize.$(MANEXT) psmerge.$(MANEXT) psjoin.$(MANEXT) fixscribeps.$(MANEXT) getafm.$(MANEXT) \ ++ fixdlsrps.$(MANEXT) fixfmps.$(MANEXT) fixpsditps.$(MANEXT) \ + fixpspps.$(MANEXT) fixtpps.$(MANEXT) fixwfwps.$(MANEXT) fixwpps.$(MANEXT) \ +- fixwwps.$(MANEXT) extractres.$(MANEXT) includeres.$(MANEXT) +-INCLUDES = md68_0.ps md71_0.ps ++ fixwwps.$(MANEXT) extractres.$(MANEXT) includeres.$(MANEXT) \ ++ showchar.$(MANEXT) + + all: $(BIN) $(PERLSCRIPTS) $(MANPAGES) $(SHELLSCRIPTS) + +@@ -68,12 +86,13 @@ epsffit: epsffit.o pserror.o + $(CC) $(CCFLAGS) -o epsffit pserror.o epsffit.o + + psnup: psnup.o psutil.o psspec.o pserror.o +- $(CC) $(CCFLAGS) -o psnup psutil.o psspec.o pserror.o psnup.o ++ $(CC) $(CCFLAGS) -o psnup psutil.o psspec.o pserror.o psnup.o $(LIBS) + + psnup.o: psutil.h patchlev.h psspec.h pserror.h psnup.c + + psresize: psresize.o psutil.o pserror.o psspec.o +- $(CC) $(CCFLAGS) -o psresize psutil.o psspec.o pserror.o psresize.o ++ $(CC) $(CCFLAGS) -o psresize psutil.o psspec.o pserror.o psresize.o \ ++ $(LIBS) + + psresize.o: psutil.h patchlev.h psspec.h pserror.h psresize.c + +@@ -88,7 +107,7 @@ psselect: psselect.o psutil.o pserror.o + psselect.o: psutil.h patchlev.h pserror.h psselect.c + + pstops: pstops.o psutil.o psspec.o pserror.o +- $(CC) $(CCFLAGS) -o pstops psutil.o psspec.o pserror.o pstops.o ++ $(CC) $(CCFLAGS) -o pstops psutil.o psspec.o pserror.o pstops.o $(LIBS) + + pstops.o: psutil.h patchlev.h psspec.h pserror.h pstops.c + +@@ -106,10 +125,6 @@ fixfmps: fixfmps.pl + $(PERL) maketext OS=$(OS) PERL=$(PERL) $? > $@ + $(CHMOD) $(BINMODE) $@ + +-fixmacps: fixmacps.pl +- $(PERL) maketext OS=$(OS) PERL=$(PERL) INCLUDE=$(INCLUDEDIR) $? > $@ +- $(CHMOD) $(BINMODE) $@ +- + fixpsditps: fixpsditps.pl + $(PERL) maketext OS=$(OS) PERL=$(PERL) $? > $@ + $(CHMOD) $(BINMODE) $@ +@@ -171,11 +186,11 @@ pstops.$(MANEXT): pstops.man + psmerge.$(MANEXT): psmerge.man + $(PERL) maketext "MAN=$(MANPAGES)" $? > $@ + +-fixfmps.$(MANEXT): fixfmps.man ++psjoin.$(MANEXT): psjoin.man + $(PERL) maketext "MAN=$(MANPAGES)" $? > $@ + +-fixmacps.$(MANEXT): fixmacps.man +- $(PERL) maketext "MAN=$(MANPAGES)" INCLUDE=$(INCLUDEDIR) $? > $@ ++fixfmps.$(MANEXT): fixfmps.man ++ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@ + + fixpsditps.$(MANEXT): fixpsditps.man + $(PERL) maketext "MAN=$(MANPAGES)" $? > $@ +@@ -210,39 +225,35 @@ includeres.$(MANEXT): includeres.man + getafm.$(MANEXT): getafm.man + $(PERL) maketext "MAN=$(MANPAGES)" $? > $@ + ++showchar.$(MANEXT): showchar.man ++ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@ ++ + clean: + rm -f *.o + + veryclean realclean: clean + rm -f $(BIN) $(PERLSCRIPTS) $(MANPAGES) + +-install: install.bin install.script install.man install.include ++install: install.bin install.script install.man + + install.bin: $(BIN) +- -mkdir $(BINDIR) ++ -mkdir -p $(DESTDIR)$(BINDIR) + @for i in $(BIN); do \ + echo Installing $$i; \ +- $(INSTALL) $$i $(BINDIR); \ ++ $(INSTALL) $$i $(DESTDIR)$(BINDIR); \ + done + + install.script: $(PERLSCRIPTS) $(SHELLSCRIPTS) +- -mkdir $(SCRIPTDIR) ++ -mkdir -p $(DESTDIR)$(SCRIPTDIR) + @for i in $(PERLSCRIPTS) $(SHELLSCRIPTS); do \ + echo Installing $$i; \ +- $(INSTALL) $$i $(SCRIPTDIR); \ +- done +- +-install.include: $(INCLUDES) +- -mkdir $(INCLUDEDIR) +- @for i in $(INCLUDES); do \ +- echo Installing $$i; \ +- $(INSTALLMAN) $$i $(INCLUDEDIR); \ ++ $(INSTALL) $$i $(DESTDIR)$(SCRIPTDIR); \ + done + + install.man: $(MANPAGES) +- -mkdir $(MANDIR) ++ -mkdir -p $(DESTDIR)$(MANDIR) + @for i in $(MANPAGES); do \ + echo Installing manual page for $$i; \ +- $(INSTALLMAN) $$i $(MANDIR)/$$i; \ ++ $(INSTALLMAN) $$i $(DESTDIR)$(MANDIR)/$$i; \ + done + +diff -rupN psutils/README psutils-new/README +--- psutils/README 1997-03-11 23:53:05.000000000 +0100 ++++ psutils-new/README 2014-04-09 21:23:02.237996540 +0200 +@@ -181,6 +181,7 @@ people, including: + Mike Coleman + Dale Scheetz dwarf@polaris.net + Yves Arrouye arrouye@marin.fdn.fr ++ Stanislav Brabec utx@penguin.cz + + (Apologies to anyone who I have left out, it was not intentional.) + +diff -rupN psutils/README.voidlinux psutils-new/README.voidlinux +--- psutils/README.voidlinux 1970-01-01 01:00:00.000000000 +0100 ++++ psutils-new/README.voidlinux 2014-04-11 16:34:36.488067584 +0200 +@@ -0,0 +1,56 @@ ++This version of psutils is patched from debian sources and has a patched Makefile to ++build and install in voidlinux. ++ ++Please report any error to voidlinux mantainer and not upstrean or to debian mantainer ++ ++It install only theese files: ++ ++epsffit ++extractres ++fixdlsrps ++fixfmps ++fixpsditps ++fixpspps ++fixscribeps ++fixtpps ++fixwfwps ++fixwpps ++fixwwps ++getafm ++includeres ++psbook ++psjoin ++psmerge ++psnup ++psresize ++psselect ++pstops ++showchar ++ ++and theese man pages: ++ ++epsffit.1 ++extractres.1 ++fixdlsrps.1 ++fixfmps.1 ++fixpsditps.1 ++fixpspps.1 ++fixscribeps.1 ++fixtpps.1 ++fixwfwps.1 ++fixwpps.1 ++fixwwps.1 ++getafm.1 ++includeres.1 ++psbook.1 ++psjoin.1 ++psmerge.1 ++psnup.1 ++psresize.1 ++psselect.1 ++pstops.1 ++showchar.1 ++ ++It retain the original LICENSE file in /usr/share/licenses/psutils ++The lacks of copyrighted files from Apple cited in the LICENSE make the copyright part in ++the original LICENSE file useless. +\ No newline at end of file +diff -rupN psutils/epsffit.c psutils-new/epsffit.c +--- psutils/epsffit.c 1997-03-11 23:52:52.000000000 +0100 ++++ psutils-new/epsffit.c 2014-04-09 19:55:19.698132829 +0200 +@@ -8,6 +8,7 @@ + * -c centres the image in the bounding box given + * -r rotates the image by 90 degrees anti-clockwise + * -a alters the aspect ratio to fit the bounding box ++ * -m rotate to maximise the size within specified bounding + * -s adds a showpage at the end of the image + * + * Added filename spec (from Larry Weissman) 5 Feb 93 +@@ -20,6 +21,7 @@ + #include + #include + #include ++#include + + #include "pserror.h" + #include "patchlev.h" +@@ -34,66 +36,76 @@ static void usage(void) + { + fprintf(stderr, "%s release %d patchlevel %d\n", program, RELEASE, PATCHLEVEL); + fprintf(stderr, "Copyright (C) Angus J. C. Duggan, 1991-1995. See file LICENSE for details.\n"); +- fprintf(stderr, "Usage: %s [-c] [-r] [-a] [-s] llx lly urx ury [infile [outfile]]\n", ++ fprintf(stderr, "Usage: %s [-c] [-r] [-a] [-m] [-s] llx lly urx ury [infile [outfile]]\n", + program); + exit(1); + } + +-void main(int argc, char **argv) ++int ++main(int argc, char **argv) + { + int bbfound = 0; /* %%BoundingBox: found */ +- int urx, ury, llx, lly; ++ int urx = 0, ury = 0, llx = 0, lly = 0; + int furx, fury, fllx, flly; + int showpage = 0, centre = 0, rotate = 0, aspect = 0, maximise = 0; + char buf[BUFSIZ]; +- FILE *input; +- FILE *output; ++ FILE *input = stdin; ++ FILE *output = stdout; ++ int opt; ++ ++ program = *argv; ++ ++ while((opt = getopt(argc, argv, "csramv")) != EOF) { ++ switch(opt) { ++ case 'c': centre = 1; break; ++ case 's': showpage = 1; break; ++ case 'r': rotate = 1; break; ++ case 'a': aspect = 1; break; ++ case 'm': maximise = 1; break; ++ case 'v': ++ default: ++ usage(); ++ break; ++ } ++ } + +- program = *argv++; argc--; ++ if ((argc - optind) < 4 || (argc - optind) > 6) usage(); + +- while (argc > 0 && argv[0][0] == '-') { +- switch (argv[0][1]) { +- case 'c': centre = 1; break; +- case 's': showpage = 1; break; +- case 'r': rotate = 1; break; +- case 'a': aspect = 1; break; +- case 'm': maximise = 1; break; +- case 'v': +- default: usage(); +- } +- argc--; +- argv++; ++ fllx = atoi(argv[optind++]); ++ flly = atoi(argv[optind++]); ++ furx = atoi(argv[optind++]); ++ fury = atoi(argv[optind++]); ++ ++ /* Be defensive */ ++ if((argc - optind) < 0 || (argc - optind) > 2) usage(); ++ ++ if ((argc - optind) > 0) { ++ if(!(input = fopen(argv[optind], OPEN_READ))) ++ message(FATAL, "can't open input file %s\n", argv[optind]); ++ optind++; + } +- +- if (argc < 4 || argc > 6) usage(); +- fllx = atoi(argv[0]); +- flly = atoi(argv[1]); +- furx = atoi(argv[2]); +- fury = atoi(argv[3]); +- +- if (argc > 4) { +- if(!(input = fopen(argv[4], OPEN_READ))) +- message(FATAL, "can't open input file %s\n", argv[4]); +- } else { + #if defined(MSDOS) || defined(WINNT) ++ else { + int fd = fileno(stdin) ; + if ( setmode(fd, O_BINARY) < 0 ) + message(FATAL, "can't reset stdin to binary mode\n"); +-#endif + input = stdin ; + } ++#endif + +- if (argc > 5) { +- if(!(output = fopen(argv[5], OPEN_WRITE))) +- message(FATAL, "can't open output file %s\n", argv[5]); +- } else { ++ if ((argc - optind) > 0) { ++ if(!(output = fopen(argv[optind], OPEN_WRITE))) ++ message(FATAL, "can't open output file %s\n", argv[optind]); ++ optind++; ++ } + #if defined(MSDOS) || defined(WINNT) ++ else { + int fd = fileno(stdout) ; + if ( setmode(fd, O_BINARY) < 0 ) + message(FATAL, "can't reset stdout to binary mode\n"); +-#endif + output = stdout ; + } ++#endif + + while (fgets(buf, BUFSIZ, input)) { + if (buf[0] == '%' && (buf[1] == '%' || buf[1] == '!')) { +diff -rupN psutils/getafm.sh psutils-new/getafm.sh +--- psutils/getafm.sh 1997-03-11 23:52:57.000000000 +0100 ++++ psutils-new/getafm.sh 2014-04-09 19:55:19.696132829 +0200 +@@ -1,7 +1,7 @@ + #!/bin/sh + + if [ $# -ne 1 ]; then +- echo "usage: $0 font-name | gsnd - >font-name.afm" >&2 ++ echo "usage: $0 font-name | gsnd -q - >font-name.afm" >&2 + exit 1 + fi + +@@ -13,6 +13,11 @@ cat << EOF + % getafm 1.00 (c) AJCD + % and getafm.ps by an unknown author, + % modified by J. Daniel Smith ++% ++% modified by Joachim H. Kaiser : ++% - suggest a quiet gs run in usage ++% - get font version info (from 'version', not 'Version') ++% - add copyright field to output + + % Metrics dictionary code added by AJCD, 7/6/93 + +@@ -66,8 +71,9 @@ cat << EOF + (isFixedPitch)(IsFixedPitch) prany + (UnderlinePosition)dup prany + (UnderlineThickness)dup prany +- (Version)(version) prany ++ (version)(Version) prany + (Notice)dup prany ++ (Copyright)dup prany + pop + } + { +diff -rupN psutils/psbook.c psutils-new/psbook.c +--- psutils/psbook.c 1997-03-11 23:53:01.000000000 +0100 ++++ psutils-new/psbook.c 2014-04-09 20:01:32.285123179 +0200 +@@ -8,6 +8,8 @@ + * psbook [-q] [-s] [infile [outfile]] + */ + ++#include ++ + #include "psutil.h" + #include "pserror.h" + #include "patchlev.h" +@@ -32,36 +34,54 @@ static void usage(void) + } + + +-void main(int argc, char *argv[]) ++int ++main(int argc, char *argv[]) + { + int signature = 0; + int currentpg, maxpage; ++ int opt; ++ ++ verbose = 1; ++ program = *argv; ++ ++ while((opt = getopt(argc, argv, "vqs:")) != EOF) { ++ switch(opt) { ++ case 's': /* signature size */ ++ signature = atoi(optarg); ++ if (signature < 1 || signature % 4) usage(); ++ break; ++ case 'q': /* quiet */ ++ verbose = 0; ++ break; ++ case 'v': /* version */ ++ default: ++ usage(); ++ break; ++ } ++ } + + infile = stdin; + outfile = stdout; +- verbose = 1; +- for (program = *argv++; --argc; argv++) { +- if (argv[0][0] == '-') { +- switch (argv[0][1]) { +- case 's': /* signature size */ +- signature = atoi(*argv+2); +- if (signature < 1 || signature % 4) usage(); +- break; +- case 'q': /* quiet */ +- verbose = 0; +- break; +- case 'v': /* version */ +- default: +- usage(); +- } +- } else if (infile == stdin) { +- if ((infile = fopen(*argv, OPEN_READ)) == NULL) +- message(FATAL, "can't open input file %s\n", *argv); +- } else if (outfile == stdout) { +- if ((outfile = fopen(*argv, OPEN_WRITE)) == NULL) +- message(FATAL, "can't open output file %s\n", *argv); +- } else usage(); ++ ++ /* Be defensive */ ++ if((argc - optind) < 0 || (argc - optind) > 2) usage(); ++ ++ if (optind != argc) { ++ /* User specified an input file */ ++ if ((infile = fopen(argv[optind], OPEN_READ)) == NULL) ++ message(FATAL, "can't open input file %s\n", argv[optind]); ++ optind++; ++ } ++ ++ if (optind != argc) { ++ /* User specified an output file */ ++ if ((outfile = fopen(argv[optind], OPEN_WRITE)) == NULL) ++ message(FATAL, "can't open output file %s\n", argv[optind]); ++ optind++; + } ++ ++ if(optind != argc) usage(); ++ + #if defined(MSDOS) || defined(WINNT) + if ( infile == stdin ) { + int fd = fileno(stdin) ; +@@ -77,7 +97,7 @@ void main(int argc, char *argv[]) + if ((infile=seekable(infile))==NULL) + message(FATAL, "can't seek input\n"); + +- scanpages(); ++ scanpages(NULL); + + if (!signature) + signature = maxpage = pages+(4-pages%4)%4; +@@ -85,7 +105,7 @@ void main(int argc, char *argv[]) + maxpage = pages+(signature-pages%signature)%signature; + + /* rearrange pages */ +- writeheader(maxpage); ++ writeheader(maxpage, NULL); + writeprolog(); + writesetup(); + for (currentpg = 0; currentpg < maxpage; currentpg++) { +diff -rupN psutils/pserror.c psutils-new/pserror.c +--- psutils/pserror.c 1997-03-11 23:53:01.000000000 +0100 ++++ psutils-new/pserror.c 2014-04-09 19:55:19.691132829 +0200 +@@ -24,7 +24,7 @@ extern char *program ; /* Defined by mai + void message(int flags, char *format, ...) + { + va_list args ; +- static column = 0 ; /* current screen column for message wrap */ ++ static int column = 0 ; /* current screen column for message wrap */ + char msgbuf[MAX_MESSAGE] ; /* buffer in which to put the message */ + char *bufptr = msgbuf ; /* message buffer pointer */ + +diff -rupN psutils/psjoin psutils-new/psjoin +--- psutils/psjoin 1970-01-01 01:00:00.000000000 +0100 ++++ psutils-new/psjoin 2014-04-09 21:24:18.122994574 +0200 +@@ -0,0 +1,208 @@ ++#!/usr/bin/perl ++# ++# psjoin - concatenate PostScript files ++# ++# version 0.2, 2002-07-18 ++# version 0.3, 2003-11-30 ++# ++# by Tom Sato , http://homepage3.nifty.com/tsato/ ++ ++$force_even = 0; ++$force_save = 0; ++$dont_strip = 0; ++$save = "save %psjoin\n"; ++$restore = "restore %psjoin\n"; ++while ($ARGV[0] =~ /^-[a-z]/i) { ++ if ($ARGV[0] eq "-a") { ++ $force_even = 1; ++ shift; ++ } elsif ($ARGV[0] eq "-s") { ++ $force_save = 1; ++ $save = "/#psjoin-save# save def %psjoin\n"; ++ $restore = "#psjoin-save# restore %psjoin\n"; ++ shift; ++ } elsif ($ARGV[0] eq "-p") { ++ $dont_strip = 1; ++ shift; ++ } elsif ($ARGV[0] eq "-h") { ++ print STDERR "psjoin - concatenate PostScript files (version 0.3)\n"; ++ print STDERR "by Tom Sato ,"; ++ print STDERR " http://member.nifty.ne.jp/tsato/\n\n"; ++ print STDERR "Usage: psjoin [ options... ] filenames...\n\n"; ++ print STDERR "Option:\n"; ++ print STDERR " -a: align first page of each documents to odd page\n"; ++ print STDERR " -s: try to close unclosed save operators\n"; ++ print STDERR " -p: not strip prolog/trailer of the input files\n"; ++ print STDERR " -h: display this\n"; ++ exit 0; ++ } else { ++ print STDERR "$0: unknown option: $ARGV[0]\n"; ++ print STDERR "(\"$0 -h\" for short description)\n"; ++ exit 2; ++ } ++} ++shift if $ARGV[0] eq "--"; ++ ++if ($dont_strip) { ++ $prolog_inx = 9999; ++ $prolog[$prolog_inx] = "% [ psjoin: don't strip ]\n"; ++ $trailer[$prolog_inx] = "% [ psjoin: don't strip ]\n"; ++} else { ++ for ($i = 0; $i <= $#ARGV; $i++) { ++ open(IN, $ARGV[$i]) || die "$0: can't open \"$ARGV[$i]\" ($!)"; ++ ++ $in_comment = 1; ++ $in_prolog = 1; ++ $in_trailer = 0; ++ $comments[$i] = ""; ++ $prolog[$i] = ""; ++ $trailer[$i] = ""; ++ $pages[$i] = 0; ++ while () { ++ next if /^%%BeginDocument/ .. /^%%EndDocument/; ++ ++ if ($in_comment) { ++ next if /^%!PS-Adobe-/; ++ next if /^%%Title/; ++ next if /^%%Pages/; ++ next if /^%%Creator/; ++ $in_comment = 0 if /^%%EndComments/; ++ $comments[$i] .= $_; ++ next; ++ } elsif ($in_prolog) { ++ if (/^%%Page:/) { ++ $in_prolog = 0; ++ } else { ++ $prolog[$i] .= $_; ++ next; ++ } ++ } ++ ++ $in_trailer = 1 if /^%%Trailer/; ++ if ($in_trailer) { ++ $trailer[$i] .= $_; ++ next; ++ } ++ ++ $pages[$i]++ if /^%%Page:/; ++ } ++ close(IN); ++ ++ if ($prolog[$i]) { ++ for ($j = 0; $j < $i; $j++) { ++ if ($prolog[$j] eq $prolog[$i]) { ++ $pages[$j] += $pages[$i]; ++ break; ++ } ++ } ++ } ++ } ++ ++ $largest = 0; ++ $prolog_inx = 0; ++ for ($i = 0; $i <= $#ARGV; $i++) { ++ $size = length($prolog[$i]) * $pages[$i]; ++ if ($largest < $size) { ++ $largest = $size; ++ $prolog_inx = $i; ++ } ++ } ++} ++ ++print "%!PS-Adobe-3.0\n"; ++print "%%Title: @ARGV\n"; ++print "%%Creator: psjoin 0.2\n"; ++print "%%Pages: (atend)\n"; ++print $comments[$prolog_inx]; ++ ++print "\n"; ++print $prolog[$prolog_inx]; ++for ($i = 0; $i <= $#ARGV; $i++) { ++ $prolog[$i] =~ s/^%%/% %%/; ++ $prolog[$i] =~ s/\n%%/\n% %%/g; ++ $trailer[$i] =~ s/^%%/% %%/; ++ $trailer[$i] =~ s/\n%%/\n% %%/g; ++} ++ ++$total_pages = 0; ++for ($i = 0; $i <= $#ARGV; $i++) { ++ print "\n"; ++ print "% [ psjoin: file = $ARGV[$i] ]\n"; ++ if ($prolog[$i] ne $prolog[$prolog_inx]) { ++ print "% [ psjoin: Prolog/Trailer will be inserted to every page ]\n"; ++ } else { ++ print "% [ psjoin: common Prolog/Trailer will be used ]\n"; ++ } ++ ++ $in_comment = 1 if !$dont_strip; ++ $in_prolog = 1 if !$dont_strip; ++ $in_trailer = 0; ++ $saved = 0; ++ $pages = 0; ++ ++ open(IN, $ARGV[$i]) || die "$0: can't open \"$ARGV[$i]\" ($!)"; ++ while () { ++ if (/^%%BeginDocument/ .. /^%%EndDocument/) { ++ # s/^(%[%!])/% \1/; ++ print $_; ++ } else { ++ if ($in_comment) { ++ $in_comment = 0 if /^%%EndComments/; ++ } elsif ($in_prolog) { ++ if (/^%%Page:/) { ++ $in_prolog = 0; ++ } else { ++ next; ++ } ++ } ++ $in_trailer = 1 if !$dont_strip && /^%%Trailer/; ++ next if $in_trailer; ++ ++ if (/^%%Page:/) { ++ if ($saved) { ++ print $trailer[$i]; ++ print $restore; ++ $saved = 0; ++ } ++ ++ $pages++; ++ $total_pages++; ++ print "\n"; ++ print "%%Page: ($i-$pages) $total_pages\n"; ++ if ($prolog[$i] ne $prolog[$prolog_inx]) { ++ print $save; ++ print $prolog[$i]; ++ $saved = 1; ++ } elsif ($force_save) { ++ print $save; ++ } ++ } else { ++ s/^(%[%!])/% \1/; ++ print $_; ++ } ++ } ++ } ++ close(IN); ++ ++ if ($force_even && $pages % 2 != 0) { ++ $pages++; ++ $total_pages++; ++ print "\n"; ++ print "%%Page: ($i-E) $total_pages\n"; ++ print "% [ psjoin: empty page inserted to force even pages ]\n"; ++ print "showpage\n"; ++ } ++ ++ if ($saved) { ++ print $trailer[$i]; ++ print $restore; ++ } elsif ($force_save) { ++ print $restore; ++ } ++} ++ ++print "\n"; ++print "%%Trailer\n"; ++print $trailer[$prolog_inx]; ++print "%%Pages: $total_pages\n"; ++print "%%EOF\n"; +diff -rupN psutils/psjoin.man psutils-new/psjoin.man +--- psutils/psjoin.man 1970-01-01 01:00:00.000000000 +0100 ++++ psutils-new/psjoin.man 2014-04-09 21:24:18.123994574 +0200 +@@ -0,0 +1,18 @@ ++.TH PSJOIN "1" "November 2003" "psjoin 0.3" "User Commands" ++.SH NAME ++psjoin \- psjoin ++.SH SYNOPSIS ++.B psjoin ++[ \fIoptions\fR... ] \fIfilenames\fR... ++.SH DESCRIPTION ++psjoin \- concatenate PostScript files (version 0.3) ++by Tom Sato , http://member.nifty.ne.jp/tsato/ ++.SS "Option:" ++.HP ++\fB\-a\fR: align first page of each documents to odd page ++.HP ++\fB\-s\fR: try to close unclosed save operators ++.HP ++\fB\-p\fR: not strip prolog/trailer of the input files ++.HP ++\fB\-h\fR: display help +diff -rupN psutils/psmerge.man psutils-new/psmerge.man +--- psutils/psmerge.man 1997-03-11 23:53:02.000000000 +0100 ++++ psutils-new/psmerge.man 2014-04-09 19:58:34.492127784 +0200 +@@ -6,9 +6,7 @@ psmerge \- filter to merge several PostS + [ + .B \-o\fIout.ps\fB + ] +-[ + .I file.ps ... +-] + .SH DESCRIPTION + .I Psmerge + merges PostScript documents into a single document. It only works in the +diff -rupN psutils/psmerge.pl psutils-new/psmerge.pl +--- psutils/psmerge.pl 1997-03-11 23:53:02.000000000 +0100 ++++ psutils-new/psmerge.pl 2014-04-09 21:17:17.098005478 +0200 +@@ -1,42 +1,66 @@ + @PERL@ + # psmerge: merge PostScript files produced by same application and setup +-# usage: psmerge [-oout.ps] [-thorough] file1.ps file2.ps ... ++# usage: psmerge [-oout.ps] file1.ps file2.ps ... + # + # Copyright (C) Angus J. C. Duggan 1991-1995 + # See file LICENSE for details. + +-$prog = ($0 =~ s=.*/==); ++use strict; ++$^W = 1; ++my $prog = ($0 =~ m,([^/\\]*)$,) ? $1 : $0; ++my $outfile = undef; ++ ++usage() unless @ARGV; + + while ($ARGV[0] =~ /^-/) { + $_ = shift; + if (/^-o(.+)/) { +- if (!close(STDOUT) || !open(STDOUT, ">$1")) { +- print STDERR "$prog: can't open $1 for output\n"; +- exit 1; +- } ++ $outfile = $1; + } elsif (/^-t(horough)?$/) { +- $thorough = 1; ++ # This doesn't do anything, but we leave it for backward compatibility. + } else { +- print STDERR "Usage: $prog [-oout] [-thorough] file...\n"; ++ usage(); ++ } ++} ++ ++my $gs = find_gs(); ++if (defined $gs) ++{ ++ # Just invoke gs ++ $outfile = '/dev/stdout' unless defined $outfile; ++ exec +(qw(gs -q -dNOPAUSE -dBATCH -sDEVICE=pswrite), ++ "-sOutputFile=$outfile", '-f', @ARGV); ++ die "$prog: exec /usr/bin/gs failed\n"; ++} ++else ++{ ++ warn +("$prog: /usr/bin/gs not found; falling back to old," . ++ " less functional behavior\n"); ++} ++ ++if (defined $outfile) ++{ ++ if (!close(STDOUT) || !open(STDOUT, ">$outfile")) { ++ print STDERR "$prog: can't open $1 for output\n"; + exit 1; + } + } + +-$page = 0; +-$first = 1; +-$nesting = 0; ++my $page = 0; ++my $first = 1; ++my $nesting = 0; + +-@header = (); +-$header = 1; ++my @header = (); ++my $header = 1; + +-@trailer = (); +-$trailer = 0; ++my @trailer = (); ++my $trailer = 0; + +-@pages = (); +-@body = (); ++my @pages = (); ++my @body = (); + +-@resources = (); +-$inresource = 0; ++my @resources = (); ++my $inresource = 0; + + while (<>) { + if (/^%%BeginFont:/ || /^%%BeginResource:/ || /^%%BeginProcSet:/) { +@@ -45,41 +69,55 @@ while (<>) { + } elsif ($inresource) { + push(@resources, $_); + $inresource = 0 if /^%%EndFont/ || /^%%EndResource/ || /^%%EndProcSet/; +- } elsif (/^%%Page:/ && $nesting == 0) { +- $header = $trailer = 0; +- push(@pages, join("", @body)) if @body; +- $page++; +- @body = ("%%Page: ($page) $page\n"); +- } elsif (/^%%Trailer/ && $nesting == 0) { +- push(@trailer, $_); +- push(@pages, join("", @body)) if @body; +- @body = (); +- $trailer = 1; +- $header = 0; +- } elsif ($header) { +- push(@trailer, $_); +- push(@pages, join("", @body)) if @body; +- @body = (); +- $trailer = 1; +- $header = 0; +- } elsif ($trailer) { +- if (/^%!/ || /%%EOF/) { +- $trailer = $first = 0; +- } elsif ($first) { +- push(@trailer, $_); +- } +- } elsif (/^%%BeginDocument/ || /^%%BeginBinary/ || /^%%BeginFile/) { +- push(@body, $_); +- $nesting++; +- } elsif (/^%%EndDocument/ || /^%%EndBinary/ || /^%%EndFile/) { +- push(@body, $_); +- $nesting--; +- } else { +- print $_ if $print; +- } ++ } elsif (/^%%Page:/ && $nesting == 0) { ++ $header = $trailer = 0; ++ push(@pages, join("", @body)) if @body; ++ $page++; ++ @body = ("%%Page: ($page) $page\n"); ++ } elsif (/^%%Trailer/ && $nesting == 0) { ++ push(@trailer, $_); ++ push(@pages, join("", @body)) if @body; ++ @body = (); ++ $trailer = 1; ++ $header = 0; ++ } elsif ($header) { ++ push(@trailer, $_); ++ push(@pages, join("", @body)) if @body; ++ @body = (); ++ $trailer = 1; ++ $header = 0; ++ } elsif ($trailer) { ++ if (/^%!/ || /%%EOF/) { ++ $trailer = $first = 0; ++ } elsif ($first) { ++ push(@trailer, $_); ++ } ++ } elsif (/^%%BeginDocument/ || /^%%BeginBinary/ || /^%%BeginFile/) { ++ push(@body, $_); ++ $nesting++; ++ } elsif (/^%%EndDocument/ || /^%%EndBinary/ || /^%%EndFile/) { ++ push(@body, $_); ++ $nesting--; ++ } + } + + print @trailer; + +-exit 0; ++sub find_gs ++{ ++ my $path = $ENV{'PATH'} || ""; ++ my @path = split(':', $path); ++ foreach my $dir (@path) ++ { ++ return "$dir/gs" if -x "$dir/gs"; ++ } ++ undef; ++} ++ ++sub usage ++{ ++ print STDERR "Usage: $prog [-oout] file...\n"; ++ exit 1; ++} ++ + @END@ +diff -rupN psutils/psnup.c psutils-new/psnup.c +--- psutils/psnup.c 1997-03-11 23:53:02.000000000 +0100 ++++ psutils-new/psnup.c 2014-04-09 21:19:57.068001335 +0200 +@@ -23,11 +23,18 @@ + * -d to draw the page boundaries + */ + ++#include ++#include ++ + #include "psutil.h" + #include "psspec.h" + #include "pserror.h" + #include "patchlev.h" + ++#ifdef DEBIAN ++#include ++#endif ++ + char *program ; + int pages ; + int verbose ; +@@ -66,21 +73,37 @@ static int nextdiv(int n, int m) + return (0); + } + +-void main(int argc, char *argv[]) ++int ++main(int argc, char *argv[]) + { +- int horiz, vert, rotate, column, flip, leftright, topbottom; ++ int horiz = 0, vert = 0, rotate = 0, column = 0; ++ int flip = 0, leftright = 0, topbottom = 0; + int nup = 1; + double draw = 0; /* draw page borders */ +- double scale; /* page scale */ ++ double scale = 1.0; /* page scale */ + double uscale = 0; /* user supplied scale */ + double ppwid, pphgt; /* paper dimensions */ + double margin, border; /* paper & page margins */ + double vshift, hshift; /* page centring shifts */ + double iwidth, iheight ; /* input paper size */ + double tolerance = 100000; /* layout tolerance */ +- Paper *paper; ++ Paper *paper = NULL; ++ off_t sizeheaders[20]; /* headers to remove */ ++ int opt; + +-#ifdef PAPER ++#ifdef DEBIAN ++ paperinit(); ++ { ++ const char *default_size = systempapername(); ++ if (!default_size) default_size = defaultpapername (); ++ if (default_size) paper = findpaper(default_size); ++ if (paper) { ++ width = (double)PaperWidth(paper); ++ height = (double)PaperHeight(paper); ++ } ++ } ++ paperdone(); ++#elif defined(PAPER) + if ( (paper = findpaper(PAPER)) != (Paper *)0 ) { + width = (double)PaperWidth(paper); + height = (double)PaperHeight(paper); +@@ -91,105 +114,129 @@ void main(int argc, char *argv[]) + leftright = topbottom = 1; + iwidth = iheight = -1 ; + ++ verbose = 1; ++ program = *argv; ++ ++ while((opt = ++ getopt(argc, argv, ++ "qd::lrfcw:W:h:H:m:b:t:s:p:P:n:1::2::3::4::5::6::7::8::9::")) ++ != EOF) { ++ switch(opt) { ++ case 'q': /* quiet */ ++ verbose = 0; ++ break; ++ case 'd': /* draw borders */ ++ if (optarg) ++ draw = singledimen(optarg, argerror, usage); ++ else ++ draw = 1; ++ break; ++ case 'l': /* landscape (rotated left) */ ++ column = !column; ++ topbottom = !topbottom; ++ break; ++ case 'r': /* seascape (rotated right) */ ++ column = !column; ++ leftright = !leftright; ++ break; ++ case 'f': /* flipped */ ++ flip = 1; ++ break; ++ case 'c': /* column major layout */ ++ column = !column; ++ break; ++ case 'w': /* page width */ ++ width = singledimen(optarg, argerror, usage); ++ break; ++ case 'W': /* input page width */ ++ iwidth = singledimen(optarg, argerror, usage); ++ break; ++ case 'h': /* page height */ ++ height = singledimen(optarg, argerror, usage); ++ break; ++ case 'H': /* input page height */ ++ iheight = singledimen(optarg, argerror, usage); ++ break; ++ case 'm': /* margins around whole page */ ++ margin = singledimen(optarg, argerror, usage); ++ break; ++ case 'b': /* border around individual pages */ ++ border = singledimen(optarg, argerror, usage); ++ break; ++ case 't': /* layout tolerance */ ++ tolerance = atof(optarg); ++ break; ++ case 's': /* override scale */ ++ uscale = atof(optarg); ++ break; ++ case 'p': /* output (and by default input) paper type */ ++ if ( (paper = findpaper(optarg)) != (Paper *)0 ) { ++ width = (double)PaperWidth(paper); ++ height = (double)PaperHeight(paper); ++ } else ++ message(FATAL, "paper size '%s' not recognised\n", optarg); ++ break; ++ case 'P': /* paper type */ ++ if ( (paper = findpaper(optarg)) != (Paper *)0 ) { ++ iwidth = (double)PaperWidth(paper); ++ iheight = (double)PaperHeight(paper); ++ } else ++ message(FATAL, "paper size '%s' not recognised\n", optarg); ++ break; ++ case 'n': /* n-up, for compatibility with other psnups */ ++ if ((nup = atoi(optarg)) < 1) ++ message(FATAL, "-n %d too small\n", nup); ++ break; ++ case '1': ++ case '2': ++ case '3': ++ case '4': ++ case '5': ++ case '6': ++ case '7': ++ case '8': ++ case '9': ++ if(optarg) { ++ char *valuestr = (char *) malloc(strlen(optarg) + 2); ++ valuestr[0] = opt; ++ strcpy(&(valuestr[1]), optarg); ++ ++ /* really should check that valuestr is only digits here...*/ ++ if ((nup = atoi(valuestr)) < 1) ++ message(FATAL, "-n %d too small\n", nup); ++ free(valuestr); ++ } else { ++ nup = (opt - '0'); ++ } ++ break; ++ case 'v': /* version */ ++ default: ++ usage(); ++ } ++ } ++ + infile = stdin; + outfile = stdout; +- verbose = 1; +- for (program = *argv++; --argc; argv++) { +- if (argv[0][0] == '-') { +- switch (argv[0][1]) { +- case 'q': /* quiet */ +- verbose = 0; +- break; +- case 'd': /* draw borders */ +- if (argv[0][2]) +- draw = singledimen(*argv+2, argerror, usage); +- else +- draw = 1; +- break; +- case 'l': /* landscape (rotated left) */ +- column = !column; +- topbottom = !topbottom; +- break; +- case 'r': /* seascape (rotated right) */ +- column = !column; +- leftright = !leftright; +- break; +- case 'f': /* flipped */ +- flip = 1; +- break; +- case 'c': /* column major layout */ +- column = !column; +- break; +- case 'w': /* page width */ +- width = singledimen(*argv+2, argerror, usage); +- break; +- case 'W': /* input page width */ +- iwidth = singledimen(*argv+2, argerror, usage); +- break; +- case 'h': /* page height */ +- height = singledimen(*argv+2, argerror, usage); +- break; +- case 'H': /* input page height */ +- iheight = singledimen(*argv+2, argerror, usage); +- break; +- case 'm': /* margins around whole page */ +- margin = singledimen(*argv+2, argerror, usage); +- break; +- case 'b': /* border around individual pages */ +- border = singledimen(*argv+2, argerror, usage); +- break; +- case 't': /* layout tolerance */ +- tolerance = atof(*argv+2); +- break; +- case 's': /* override scale */ +- uscale = atof(*argv+2); +- break; +- case 'p': /* output (and by default input) paper type */ +- if ( (paper = findpaper(*argv+2)) != (Paper *)0 ) { +- width = (double)PaperWidth(paper); +- height = (double)PaperHeight(paper); +- } else +- message(FATAL, "paper size '%s' not recognised\n", *argv+2); +- break; +- case 'P': /* paper type */ +- if ( (paper = findpaper(*argv+2)) != (Paper *)0 ) { +- iwidth = (double)PaperWidth(paper); +- iheight = (double)PaperHeight(paper); +- } else +- message(FATAL, "paper size '%s' not recognised\n", *argv+2); +- break; +- case 'n': /* n-up, for compatibility with other psnups */ +- if (argc >= 2) { +- argv++; +- argc--; +- if ((nup = atoi(*argv)) < 1) +- message(FATAL, "-n %d too small\n", nup); +- } else +- message(FATAL, "argument expected for -n\n"); +- break; +- case '1': +- case '2': +- case '3': +- case '4': +- case '5': +- case '6': +- case '7': +- case '8': +- case '9': +- nup = atoi(*argv+1); +- break; +- case 'v': /* version */ +- default: +- usage(); +- } +- } else if (infile == stdin) { +- if ((infile = fopen(*argv, OPEN_READ)) == NULL) +- message(FATAL, "can't open input file %s\n", *argv); +- } else if (outfile == stdout) { +- if ((outfile = fopen(*argv, OPEN_WRITE)) == NULL) +- message(FATAL, "can't open output file %s\n", *argv); +- } else usage(); ++ ++ /* Be defensive */ ++ if((argc - optind) < 0 || (argc - optind) > 2) usage(); ++ ++ if (optind != argc) { ++ /* User specified an input file */ ++ if ((infile = fopen(argv[optind], OPEN_READ)) == NULL) ++ message(FATAL, "can't open input file %s\n", argv[optind]); ++ optind++; + } ++ ++ if (optind != argc) { ++ /* User specified an output file */ ++ if ((outfile = fopen(argv[optind], OPEN_WRITE)) == NULL) ++ message(FATAL, "can't open output file %s\n", argv[optind]); ++ optind++; ++ } ++ ++ if (optind != argc) usage(); ++ + #if defined(MSDOS) || defined(WINNT) + if ( infile == stdin ) { + int fd = fileno(stdin) ; +@@ -215,6 +262,8 @@ void main(int argc, char *argv[]) + if (ppwid <= 0 || pphgt <= 0) + message(FATAL, "paper margins are too large\n"); + ++ scanpages(sizeheaders); ++ + /* set default values of input height & width */ + if ( iwidth > 0 ) + width = iwidth ; +@@ -328,7 +377,7 @@ void main(int argc, char *argv[]) + } + } + +- pstops(nup, 1, 0, specs, draw); /* do page rearrangement */ ++ pstops_write(nup, 1, 0, specs, draw, sizeheaders); /* do page rearrangement */ + } + + exit(0); +diff -rupN psutils/psnup.man psutils-new/psnup.man +--- psutils/psnup.man 1997-03-11 23:53:02.000000000 +0100 ++++ psutils-new/psnup.man 2014-04-09 19:55:19.695132829 +0200 +@@ -61,11 +61,12 @@ to centimeters or inches. + The + .I \-p + option can be used as an alternative, to set the paper size to +-.B a3, a4, a5, b5, letter, legal, tabloid, statement, executive, folio, quarto +-or ++.B a0, a1, a2, a3, a4, a5, b5, letter, legal, tabloid, statement, ++executive, folio, quarto or + .B 10x14. +-The default paper size is +-.B @PAPER@. ++The default paper size is normally ++.B @PAPER@, ++but on a Debian system, /etc/papersize is consulted. + The + .I \-W, \-H, + and +diff -rupN psutils/psresize.c psutils-new/psresize.c +--- psutils/psresize.c 1997-03-11 23:53:03.000000000 +0100 ++++ psutils-new/psresize.c 2014-04-09 21:19:57.069001335 +0200 +@@ -15,11 +15,17 @@ + * -Ppaper sets the input paper size (width and height) by name + */ + ++#include ++ + #include "psutil.h" + #include "psspec.h" + #include "pserror.h" + #include "patchlev.h" + ++#ifdef DEBIAN ++#include ++#endif ++ + char *program ; + int pages ; + int verbose ; +@@ -46,7 +52,8 @@ static void argerror(void) + #define MIN(x,y) ((x) > (y) ? (y) : (x)) + #define MAX(x,y) ((x) > (y) ? (x) : (y)) + +-void main(int argc, char *argv[]) ++int ++main(int argc, char *argv[]) + { + double scale, rscale; /* page scale */ + double waste, rwaste; /* amount wasted */ +@@ -54,10 +61,24 @@ void main(int argc, char *argv[]) + int rotate; + double inwidth = -1; + double inheight = -1; +- Paper *paper; ++ off_t sizeheaders[20]; /* headers to remove */ ++ Paper *paper = NULL; + PageSpec *specs; ++ int opt; + +-#ifdef PAPER ++#ifdef DEBIAN ++ paperinit(); ++ { ++ const char *default_size = systempapername(); ++ if (!default_size) default_size = defaultpapername (); ++ if (default_size) paper = findpaper(default_size); ++ if (paper) { ++ inwidth = width = (double)PaperWidth(paper); ++ inheight = height = (double)PaperHeight(paper); ++ } ++ } ++ paperdone(); ++#elif defined(PAPER) + if ( (paper = findpaper(PAPER)) != (Paper *)0 ) { + inwidth = width = (double)PaperWidth(paper); + inheight = height = (double)PaperHeight(paper); +@@ -67,53 +88,72 @@ void main(int argc, char *argv[]) + vshift = hshift = 0; + rotate = 0; + ++ verbose = 1; ++ ++ ++ program = *argv; ++ ++ while((opt = getopt(argc, argv, ++ "qw:h:p:W:H:P:")) != EOF) { ++ switch(opt) { ++ ++ case 'q': /* quiet */ ++ verbose = 0; ++ break; ++ case 'w': /* page width */ ++ width = singledimen(optarg, argerror, usage); ++ break; ++ case 'h': /* page height */ ++ height = singledimen(optarg, argerror, usage); ++ break; ++ case 'p': /* paper type */ ++ if ( (paper = findpaper(optarg)) != (Paper *)0 ) { ++ width = (double)PaperWidth(paper); ++ height = (double)PaperHeight(paper); ++ } else ++ message(FATAL, "paper size '%s' not recognised\n", optarg); ++ break; ++ case 'W': /* input page width */ ++ inwidth = singledimen(optarg, argerror, usage); ++ break; ++ case 'H': /* input page height */ ++ inheight = singledimen(optarg, argerror, usage); ++ break; ++ case 'P': /* input paper type */ ++ if ( (paper = findpaper(optarg)) != (Paper *)0 ) { ++ inwidth = (double)PaperWidth(paper); ++ inheight = (double)PaperHeight(paper); ++ } else ++ message(FATAL, "paper size '%s' not recognised\n", optarg); ++ break; ++ case 'v': /* version */ ++ default: ++ usage(); ++ } ++ } ++ + infile = stdin; + outfile = stdout; +- verbose = 1; +- for (program = *argv++; --argc; argv++) { +- if (argv[0][0] == '-') { +- switch (argv[0][1]) { +- case 'q': /* quiet */ +- verbose = 0; +- break; +- case 'w': /* page width */ +- width = singledimen(*argv+2, argerror, usage); +- break; +- case 'h': /* page height */ +- height = singledimen(*argv+2, argerror, usage); +- break; +- case 'p': /* paper type */ +- if ( (paper = findpaper(*argv+2)) != (Paper *)0 ) { +- width = (double)PaperWidth(paper); +- height = (double)PaperHeight(paper); +- } else +- message(FATAL, "paper size '%s' not recognised\n", *argv+2); +- break; +- case 'W': /* input page width */ +- inwidth = singledimen(*argv+2, argerror, usage); +- break; +- case 'H': /* input page height */ +- inheight = singledimen(*argv+2, argerror, usage); +- break; +- case 'P': /* input paper type */ +- if ( (paper = findpaper(*argv+2)) != (Paper *)0 ) { +- inwidth = (double)PaperWidth(paper); +- inheight = (double)PaperHeight(paper); +- } else +- message(FATAL, "paper size '%s' not recognised\n", *argv+2); +- break; +- case 'v': /* version */ +- default: +- usage(); +- } +- } else if (infile == stdin) { +- if ((infile = fopen(*argv, OPEN_READ)) == NULL) +- message(FATAL, "can't open input file %s\n", *argv); +- } else if (outfile == stdout) { +- if ((outfile = fopen(*argv, OPEN_WRITE)) == NULL) +- message(FATAL, "can't open output file %s\n", *argv); +- } else usage(); ++ ++ /* Be defensive */ ++ if((argc - optind) < 0 || (argc - optind) > 2) usage(); ++ ++ if (optind != argc) { ++ /* User specified an input file */ ++ if ((infile = fopen(argv[optind], OPEN_READ)) == NULL) ++ message(FATAL, "can't open input file %s\n", argv[optind]); ++ optind++; + } ++ ++ if (optind != argc) { ++ /* User specified an output file */ ++ if ((outfile = fopen(argv[optind], OPEN_WRITE)) == NULL) ++ message(FATAL, "can't open output file %s\n", argv[optind]); ++ optind++; ++ } ++ ++ if (optind != argc) usage(); ++ + #if defined(MSDOS) || defined(WINNT) + if ( infile == stdin ) { + int fd = fileno(stdin) ; +@@ -132,6 +172,8 @@ void main(int argc, char *argv[]) + if (width <= 0 || height <= 0) + message(FATAL, "output page width and height must be set\n"); + ++ scanpages(sizeheaders); ++ + if (inwidth <= 0 || inheight <= 0) + message(FATAL, "input page width and height must be set\n"); + +@@ -173,7 +215,7 @@ void main(int argc, char *argv[]) + specs->yoff = vshift; + specs->flags |= OFFSET; + +- pstops(1, 1, 0, specs, 0.0); /* do page rearrangement */ ++ pstops_write(1, 1, 0, specs, 0.0, sizeheaders); /* do page rearrangement */ + + exit(0); + } +diff -rupN psutils/psresize.man psutils-new/psresize.man +--- psutils/psresize.man 1997-03-11 23:53:03.000000000 +0100 ++++ psutils-new/psresize.man 2014-04-09 19:55:19.699132829 +0200 +@@ -1,6 +1,6 @@ + .TH PSRESIZE 1 "PSUtils Release @RELEASE@ Patchlevel @PATCHLEVEL@" + .SH NAME +-psresize \- multiple pages per sheet ++psresize \- rescales and centers a document for new output paper size + .SH SYNOPSIS + .B psresize + [ +@@ -42,8 +42,8 @@ to centimeters or inches. + The + .I \-p + option can be used as an alternative, to set the output paper size to +-.B a3, a4, a5, b5, letter, legal, tabloid, statement, executive, folio, quarto +-or ++.B a0, a1, a2, a3, a4, a5, b5, letter, legal, tabloid, statement, ++executive, folio, quarto or + .B 10x14. + The default output paper size is + .B @PAPER@. +diff -rupN psutils/psselect.c psutils-new/psselect.c +--- psutils/psselect.c 1997-03-11 23:53:03.000000000 +0100 ++++ psutils-new/psselect.c 2014-04-09 20:01:32.286123179 +0200 +@@ -11,12 +11,13 @@ + #include "psutil.h" + #include "pserror.h" + #include "patchlev.h" ++#include + + char *program ; + int pages ; + int verbose ; +-FILE *infile ; +-FILE *outfile ; ++FILE *infile; ++FILE *outfile; + char pagelabel[BUFSIZ] ; + int pageno ; + +@@ -52,6 +53,9 @@ static PageRange *addrange(char *str, Pa + { + int first=0; + int sign; ++ ++ if(!str) return NULL; ++ + sign = (*str == '_' && ++str) ? -1 : 1; + if (isdigit(*str)) { + first = sign*atoi(str); +@@ -91,48 +95,70 @@ static PageRange *addrange(char *str, Pa + } + + +-void main(int argc, char *argv[]) ++int ++main(int argc, char *argv[]) + { ++ int opt; + int currentpg, maxpage = 0; + int even = 0, odd = 0, reverse = 0; + int pass, all; + PageRange *pagerange = NULL; + ++ verbose = 1; ++ program = *argv; ++ ++ while((opt = getopt(argc, argv, "eorqvp:")) != EOF) { ++ switch(opt) { ++ case 'e': /* even pages */ ++ even = 1; ++ break; ++ case 'o': /* odd pages */ ++ odd = 1; ++ break; ++ case 'r': /* reverse */ ++ reverse = 1; ++ break; ++ case 'p': /* page spec */ ++ pagerange = addrange(optarg, pagerange); ++ break; ++ case 'q': /* quiet */ ++ verbose = 0; ++ break; ++ case 'v': /* version */ ++ default: ++ usage(); ++ break; ++ } ++ } ++ + infile = stdin; + outfile = stdout; +- verbose = 1; +- for (program = *argv++; --argc; argv++) { +- if (argv[0][0] == '-') { +- switch (argv[0][1]) { +- case 'e': /* even pages */ +- even = 1; +- break; +- case 'o': /* odd pages */ +- odd = 1; +- break; +- case 'r': /* reverse */ +- reverse = 1; +- break; +- case 'p': /* page spec */ +- pagerange = addrange(*argv+2, pagerange); +- break; +- case 'q': /* quiet */ +- verbose = 0; +- break; +- case 'v': /* version */ +- default: +- usage(); +- } +- } else if (pagerange == NULL && !reverse && !even && !odd) { +- pagerange = addrange(*argv, NULL); +- } else if (infile == stdin) { +- if ((infile = fopen(*argv, OPEN_READ)) == NULL) +- message(FATAL, "can't open input file %s\n", *argv); +- } else if (outfile == stdout) { +- if ((outfile = fopen(*argv, OPEN_WRITE)) == NULL) +- message(FATAL, "can't open output file %s\n", *argv); +- } else usage(); ++ ++ /* If we haven't gotten a page range yet, we better get one now */ ++ if (pagerange == NULL && !reverse && !even && !odd) { ++ pagerange = addrange(argv[optind], NULL); ++ optind++; + } ++ ++ /* Be defensive */ ++ if((argc - optind) < 0 || (argc - optind) > 2) usage(); ++ ++ if (optind != argc) { ++ /* User specified an input file */ ++ if ((infile = fopen(argv[optind], OPEN_READ)) == NULL) ++ message(FATAL, "can't open input file %s\n", argv[optind]); ++ optind++; ++ } ++ ++ if (optind != argc) { ++ /* User specified an output file */ ++ if ((outfile = fopen(argv[optind], OPEN_WRITE)) == NULL) ++ message(FATAL, "can't open output file %s\n", argv[optind]); ++ optind++; ++ } ++ ++ if(optind != argc) usage(); ++ + #if defined(MSDOS) || defined(WINNT) + if ( infile == stdin ) { + int fd = fileno(stdin) ; +@@ -145,10 +171,11 @@ void main(int argc, char *argv[]) + message(FATAL, "can't reset stdout to binary mode\n"); + } + #endif ++ + if ((infile=seekable(infile))==NULL) + message(FATAL, "can't seek input\n"); + +- scanpages(); ++ scanpages(NULL); + + /* select all pages or all in range if odd or even not set */ + all = !(odd || even); +@@ -197,7 +224,7 @@ void main(int argc, char *argv[]) + for (pass = 0; pass < 2; pass++) { + PageRange *r; + if (pass) { /* write header on second pass */ +- writeheader(maxpage); ++ writeheader(maxpage, NULL); + writeprolog(); + writesetup(); + } +diff -rupN psutils/psspec.c psutils-new/psspec.c +--- psutils/psspec.c 1997-03-11 23:53:04.000000000 +0100 ++++ psutils-new/psspec.c 2014-04-09 21:23:02.236996540 +0200 +@@ -22,6 +22,8 @@ PageSpec *newspec(void) + if (temp == NULL) + message(FATAL, "out of memory\n"); + temp->reversed = temp->pageno = temp->flags = temp->rotate = 0; ++ temp->hflip = 0; ++ temp->vflip = 0; + temp->scale = 1; + temp->xoff = temp->yoff = 0; + temp->next = NULL; +@@ -93,10 +95,13 @@ double singledimen(char *str, void (*err + + static char *prologue[] = { /* PStoPS procset */ + #ifndef SHOWPAGE_LOAD ++ /* Wrap these up with our own versions. We have to */ + "userdict begin", +- "[/showpage/erasepage/copypage]{dup where{pop dup load", /* prevent */ +- " type/operatortype eq{1 array cvx dup 0 3 index cvx put", /* binding */ +- " bind def}{pop}ifelse}{pop}ifelse}forall", /* in prolog */ ++ "[/showpage/erasepage/copypage]{dup where{pop dup load", ++ " type/operatortype eq{ /PStoPSenablepage cvx 1 index" ++ " load 1 array astore cvx {} bind /ifelse cvx 4 array" ++ " astore cvx def}{pop}ifelse}{pop}ifelse}forall" ++ " /PStoPSenablepage true def", + #else + "userdict begin", + "[/showpage/copypage/erasepage]{dup 10 string cvs dup", +@@ -134,18 +139,22 @@ static char *prologue[] = { /* PStoPS pr + NULL + }; + +-void pstops(int modulo, int pps, int nobind, PageSpec *specs, double draw) ++void pstops(int modulo, int pps, int nobind, PageSpec *specs, double draw) { ++ ++ scanpages(NULL); ++ pstops_write(modulo, pps, nobind, specs, draw, NULL); ++} ++ ++void pstops_write(int modulo, int pps, int nobind, PageSpec *specs, double draw, off_t *ignorelist) + { + int thispg, maxpage; + int pageindex = 0; + char **pro; + +- scanpages(); +- + maxpage = ((pages+modulo-1)/modulo)*modulo; + + /* rearrange pages: doesn't cope properly with loaded definitions */ +- writeheader((maxpage/modulo)*pps); ++ writeheadermedia((maxpage/modulo)*pps, ignorelist, width, height); + #ifndef SHOWPAGE_LOAD + writestring("%%BeginProcSet: PStoPS"); + #else +@@ -208,6 +217,14 @@ void pstops(int modulo, int pps, int nob + sprintf(buffer, "%d rotate\n", ps->rotate); + writestring(buffer); + } ++ if ((ps->flags & HFLIP) && (ps->hflip%2)) { ++ sprintf(buffer, "[ -1 0 0 1 %f 0 ] concat\n", width*ps->scale); ++ writestring(buffer); ++ } ++ if ((ps->flags & VFLIP) && (ps->vflip%2)) { ++ sprintf(buffer, "[ 1 0 0 -1 0 %f ] concat\n", height*ps->scale); ++ writestring(buffer); ++ } + if (ps->flags & SCALE) { + sprintf(buffer, "%f dup scale\n", ps->scale); + writestring(buffer); +@@ -228,7 +245,7 @@ void pstops(int modulo, int pps, int nob + } + if (add_next) { + #ifndef SHOWPAGE_LOAD +- writestring("/showpage{}def/copypage{}def/erasepage{}def\n"); ++ writestring("/PStoPSenablepage false def\n"); + #else + writestring("/PStoPSshowpage{}store/PStoPScopypage{}store/PStoPSerasepage{}store\n"); + #endif +diff -rupN psutils/psspec.h psutils-new/psspec.h +--- psutils/psspec.h 1997-03-11 23:53:04.000000000 +0100 ++++ psutils-new/psspec.h 2014-04-09 21:23:02.235996540 +0200 +@@ -8,12 +8,14 @@ + /* pagespec flags */ + #define ADD_NEXT (0x01) + #define ROTATE (0x02) +-#define SCALE (0x04) +-#define OFFSET (0x08) +-#define GSAVE (ROTATE|SCALE|OFFSET) ++#define HFLIP (0x04) ++#define VFLIP (0x08) ++#define SCALE (0x10) ++#define OFFSET (0x20) ++#define GSAVE (ROTATE|HFLIP|VFLIP|SCALE|OFFSET) + + typedef struct pagespec { +- int reversed, pageno, flags, rotate; ++ int reversed, pageno, flags, rotate, hflip, vflip; + double xoff, yoff, scale; + struct pagespec *next; + } PageSpec ; +@@ -28,3 +30,5 @@ extern double singledimen(char *str, voi + void (*usagefn)(void)); + extern void pstops(int modulo, int pps, int nobind, PageSpec *specs, + double draw); ++extern void pstops_write(int modulo, int pps, int nobind, PageSpec *specs, ++ double draw, off_t *ignorelist); +diff -rupN psutils/pstops.c psutils-new/pstops.c +--- psutils/pstops.c 1997-03-11 23:53:04.000000000 +0100 ++++ psutils-new/pstops.c 2014-04-09 21:23:02.234996540 +0200 +@@ -8,11 +8,18 @@ + * pstops [-q] [-b] [-d] [-w] [-h] [-ppaper] [infile [outfile]] + */ + ++#include ++#include ++ + #include "psutil.h" + #include "psspec.h" + #include "pserror.h" + #include "patchlev.h" + ++#ifdef DEBIAN ++#include ++#endif ++ + char *program ; + int pages ; + int verbose ; +@@ -35,7 +42,7 @@ static void argerror(void) + { + fprintf(stderr, "%s: page specification error:\n", program); + fprintf(stderr, " = [modulo:]\n"); +- fprintf(stderr, " = [-]pageno[@scale][L|R|U][(xoff,yoff)][,spec|+spec]\n"); ++ fprintf(stderr, " = [-]pageno[@scale][L|R|U|H|V][(xoff,yoff)][,spec|+spec]\n"); + fprintf(stderr, " modulo>=1, 0<=pagenoreversed = !tail->reversed; + break; + case '@': +- if (num < 0) argerror(); +- tail->scale *= parsedouble(&str, argerror); +- tail->flags |= SCALE; +- break; ++ tail->scale *= parsedouble(&str, argerror); ++ tail->flags |= SCALE; ++ break; + case 'l': case 'L': + tail->rotate += 90; + tail->flags |= ROTATE; +@@ -81,6 +87,14 @@ static PageSpec *parsespecs(char *str) + tail->rotate += 180; + tail->flags |= ROTATE; + break; ++ case 'h': case 'H': ++ tail->hflip += 1; ++ tail->flags |= HFLIP; ++ break; ++ case 'v': case 'V': ++ tail->vflip += 1; ++ tail->flags |= VFLIP; ++ break; + case '(': + tail->xoff += parsedimen(&str, argerror); + if (*str++ != ',') argerror(); +@@ -102,7 +116,7 @@ static PageSpec *parsespecs(char *str) + default: + argerror(); + } +- other = 1; ++ spec_count++; + } + } + if (num >= modulo) +@@ -112,71 +126,124 @@ static PageSpec *parsespecs(char *str) + return (head); + } + +-void main(int argc, char *argv[]) ++int ++main(int argc, char *argv[]) + { + PageSpec *specs = NULL; + int nobinding = 0; + double draw = 0; +- Paper *paper; ++ Paper *paper = NULL; ++ int opt; + +-#ifdef PAPER ++#ifdef DEBIAN ++ paperinit(); ++ { ++ const char *default_size = systempapername(); ++ if (!default_size) default_size = defaultpapername (); ++ if (default_size) paper = findpaper(default_size); ++ if (paper) { ++ width = (double)PaperWidth(paper); ++ height = (double)PaperHeight(paper); ++ } ++ } ++ paperdone(); ++#elif defined(PAPER) + if ( (paper = findpaper(PAPER)) != (Paper *)0 ) { + width = (double)PaperWidth(paper); + height = (double)PaperHeight(paper); + } + #endif + ++ verbose = 1; ++ ++ program = *argv; ++ ++ while((opt = getopt(argc, argv, "qd::bw:h:p:v0123456789")) != EOF) { ++ switch(opt) { ++ case 'q': /* quiet */ ++ verbose = 0; ++ break; ++ case 'd': /* draw borders */ ++ if(optarg) ++ draw = singledimen(optarg, argerror, usage); ++ else ++ draw = 1; ++ break; ++ case 'b': /* no bind operator */ ++ nobinding = 1; ++ break; ++ case 'w': /* page width */ ++ width = singledimen(optarg, argerror, usage); ++ break; ++ case 'h': /* page height */ ++ height = singledimen(optarg, argerror, usage); ++ break; ++ case 'p': /* paper type */ ++ if ( (paper = findpaper(optarg)) != (Paper *)0 ) { ++ width = (double)PaperWidth(paper); ++ height = (double)PaperHeight(paper); ++ } else ++ message(FATAL, "paper size '%s' not recognised\n", optarg); ++ break; ++ case 'v': /* version */ ++ usage(); ++ case '0': ++ case '1': ++ case '2': ++ case '3': ++ case '4': ++ case '5': ++ case '6': ++ case '7': ++ case '8': ++ case '9': ++ if (specs == NULL) { ++ char *spec_txt = alloca((optarg ? strlen(optarg) : 0) + 3); ++ if(!spec_txt) message(FATAL, "no memory for spec allocation\n"); ++ spec_txt[0] = '-'; ++ spec_txt[1] = opt; ++ spec_txt[2] = 0; ++ if (optarg) strcat(spec_txt, optarg); ++ specs = parsespecs(spec_txt); ++ } else { ++ usage(); ++ } ++ break; ++ default: ++ usage(); ++ break; ++ } ++ } ++ ++ if (specs == NULL) { ++ if(optind == argc) usage(); ++ specs = parsespecs(argv[optind]); ++ optind++; ++ } ++ + infile = stdin; + outfile = stdout; +- verbose = 1; +- for (program = *argv++; --argc; argv++) { +- if (argv[0][0] == '-') { +- switch (argv[0][1]) { +- case 'q': /* quiet */ +- verbose = 0; +- break; +- case 'd': /* draw borders */ +- if (argv[0][2]) +- draw = singledimen(*argv+2, argerror, usage); +- else +- draw = 1; +- break; +- case 'b': /* no bind operator */ +- nobinding = 1; +- break; +- case 'w': /* page width */ +- width = singledimen(*argv+2, argerror, usage); +- break; +- case 'h': /* page height */ +- height = singledimen(*argv+2, argerror, usage); +- break; +- case 'p': /* paper type */ +- if ( (paper = findpaper(*argv+2)) != (Paper *)0 ) { +- width = (double)PaperWidth(paper); +- height = (double)PaperHeight(paper); +- } else +- message(FATAL, "paper size '%s' not recognised\n", *argv+2); +- break; +- case 'v': /* version */ +- usage(); +- default: +- if (specs == NULL) +- specs = parsespecs(*argv); +- else +- usage(); +- } +- } else if (specs == NULL) +- specs = parsespecs(*argv); +- else if (infile == stdin) { +- if ((infile = fopen(*argv, OPEN_READ)) == NULL) +- message(FATAL, "can't open input file %s\n", *argv); +- } else if (outfile == stdout) { +- if ((outfile = fopen(*argv, OPEN_WRITE)) == NULL) +- message(FATAL, "can't open output file %s\n", *argv); +- } else usage(); ++ ++ /* Be defensive */ ++ if((argc - optind) < 0 || (argc - optind) > 2) usage(); ++ ++ if (optind != argc) { ++ /* User specified an input file */ ++ if ((infile = fopen(argv[optind], OPEN_READ)) == NULL) ++ message(FATAL, "can't open input file %s\n", argv[optind]); ++ optind++; ++ } ++ ++ if (optind != argc) { ++ /* User specified an output file */ ++ if ((outfile = fopen(argv[optind], OPEN_WRITE)) == NULL) ++ message(FATAL, "can't open output file %s\n", argv[optind]); ++ optind++; + } +- if (specs == NULL) +- usage(); ++ ++ if (optind != argc) usage(); ++ if (specs == NULL) usage(); ++ + #if defined(MSDOS) || defined(WINNT) + if ( infile == stdin ) { + int fd = fileno(stdin) ; +diff -rupN psutils/pstops.man psutils-new/pstops.man +--- psutils/pstops.man 1997-03-11 23:53:04.000000000 +0100 ++++ psutils-new/pstops.man 2014-04-09 21:23:02.236996540 +0200 +@@ -43,7 +43,7 @@ follow the syntax: + .I = spec[+specs][,specs] + .TP + .I spec +-.I = [-]pageno[L][R][U][@scale][(xoff,yoff)] ++.I = [-]pageno[L][R][U][H][V][@scale][(xoff,yoff)] + .RE + .sp + .I modulo +@@ -74,8 +74,9 @@ to convert to centimetres or inches, or + or + .B "h" + to specify as a multiple of the width or height. +-The optional parameters \fIL\fR, \fIR\fR, and \fIU\fR rotate the page left, +-right, or upside-down. ++The optional parameters \fIL\fR, \fIR\fR, \fIU\fR, \fIH\fR and \fIV\fR ++rotate the page left, right, or upside-down, and flip (mirror) page ++horizontally or vertically. + The optional + .I scale + parameter scales the page by the fraction specified. +@@ -85,15 +86,20 @@ the document, instead of the start. + If page \fIspec\fRs are separated by + .B \+ + the pages will be merged into one page; if they are separated by +-.B \, ++.B , + they will be on separate pages. + If there is only one page specification, with + .I pageno + zero, the \fIpageno\fR may be omitted. + +-The shift, rotation, and scaling are performed ++The shift, rotation, and scaling are applied ++to the PostScript transformation matrix + in that order regardless of which order + they appear on the command line. ++The matrix accumulates the individual transformations. ++The effect on the image is to first scale with respect to an origin ++at the lower left corner, then rotate about the same origin, and ++finally shift. + .PP + The + .I \-w +@@ -108,8 +114,8 @@ clipping path for each page. + The + .I \-p + option can be used as an alternative, to set the paper size to +-.B a3, a4, a5, b5, letter, legal, tabloid, statement, executive, folio, quarto +-or ++.B a0, a1, a2, a3, a4, a5, b5, letter, legal, tabloid, statement, ++executive, folio, quarto or + .B 10x14. + The default paper size is + .B @PAPER@. +@@ -136,7 +142,7 @@ This section contains some sample re-arr + sheet (of A4 paper), the pagespec to use is: + .sp + .ce +-2:0L@.7(21cm,0)+1L@.7(21cm,14.85cm) ++"2:0L@.7(21cm,0)+1L@.7(21cm,14.85cm)" + .sp + To select all of the odd pages in reverse order, use: + .sp +@@ -146,12 +152,12 @@ To select all of the odd pages in revers + To re-arrange pages for printing 2-up booklets, use + .sp + .ce +-4:-3L@.7(21cm,0)+0L@.7(21cm,14.85cm) ++"4:-3L@.7(21cm,0)+0L@.7(21cm,14.85cm)" + .sp + for the front sides, and + .sp + .ce +-4:1L@.7(21cm,0)+-2L@.7(21cm,14.85cm) ++"4:1L@.7(21cm,0)+-2L@.7(21cm,14.85cm)" + .sp + for the reverse sides (or join them with a comma for duplex printing). + .SH AUTHOR +diff -rupN psutils/psutil.c psutils-new/psutil.c +--- psutils/psutil.c 1997-03-11 23:53:04.000000000 +0100 ++++ psutils-new/psutil.c 2014-04-09 21:19:57.065001335 +0200 +@@ -5,7 +5,10 @@ + * utilities for PS programs + */ + ++ + /* ++ * Daniele Giacomini appunti2@gmail.com 2010-09-02 ++ * Changed to using ftello() and fseeko() + * AJCD 6/4/93 + * Changed to using ftell() and fseek() only (no length calculations) + * Hunter Goatley 31-MAY-1993 23:33 +@@ -13,6 +16,9 @@ + * Hunter Goatley 2-MAR-1993 14:41 + * Added VMS support. + */ ++ ++#define _FILE_OFFSET_BITS 64 ++ + #include "psutil.h" + #include "pserror.h" + #include "patchlev.h" +@@ -20,6 +26,7 @@ + #include + #include + #include ++#include + + #define iscomment(x,y) (strncmp(x,y,strlen(y)) == 0) + +@@ -33,21 +40,27 @@ extern int pageno; + + static char buffer[BUFSIZ]; + static long bytes = 0; +-static long pagescmt = 0; +-static long headerpos = 0; +-static long endsetup = 0; +-static long beginprocset = 0; /* start of pstops procset */ +-static long endprocset = 0; ++static off_t pagescmt = 0; ++static off_t headerpos = 0; ++static off_t endsetup = 0; ++static off_t beginprocset = 0; /* start of pstops procset */ ++static off_t endprocset = 0; + static int outputpage = 0; + static int maxpages = 100; +-static long *pageptr; ++static off_t *pageptr; + + /* list of paper sizes supported */ + static Paper papersizes[] = { ++ { "a0", 2382, 3369 }, /* 84cm * 118.8cm */ ++ { "a1", 1684, 2382 }, /* 59.4cm * 84cm */ ++ { "a2", 1191, 1684 }, /* 42cm * 59.4cm */ + { "a3", 842, 1191 }, /* 29.7cm * 42cm */ + { "a4", 595, 842 }, /* 21cm * 29.7cm */ + { "a5", 421, 595 }, /* 14.85cm * 21cm */ + { "b5", 516, 729 }, /* 18.2cm * 25.72cm */ ++ { "A0", 2382, 3369 }, /* 84cm * 118.8cm */ ++ { "A1", 1684, 2382 }, /* 59.4cm * 84cm */ ++ { "A2", 1191, 1684 }, /* 42cm * 59.4cm */ + { "A3", 842, 1191 }, /* 29.7cm * 42cm */ + { "A4", 595, 842 }, /* 21cm * 29.7cm */ + { "A5", 421, 595 }, /* 14.85cm * 21cm */ +@@ -65,7 +78,7 @@ static Paper papersizes[] = { + }; + + /* return pointer to paper size struct or NULL */ +-Paper* findpaper(char *name) ++Paper* findpaper(const char *name) + { + Paper *pp; + for (pp = papersizes; PaperName(pp); pp++) { +@@ -88,15 +101,15 @@ FILE *seekable(FILE *fp) + #if defined(WINNT) + struct _stat fs ; + #else +- long fpos; ++ off_t fpos; + #endif + + #if defined(WINNT) + if (_fstat(fileno(fp), &fs) == 0 && (fs.st_mode&_S_IFREG) != 0) + return (fp); + #else +- if ((fpos = ftell(fp)) >= 0) +- if (!fseek(fp, 0L, SEEK_END) && !fseek(fp, fpos, SEEK_SET)) ++ if ((fpos = ftello(fp)) >= 0) ++ if (!fseeko(fp, (off_t) 0, SEEK_END) && !fseeko(fp, fpos, SEEK_SET)) + return (fp); + #endif + +@@ -121,7 +134,7 @@ FILE *seekable(FILE *fp) + + /* discard the input file, and rewind the temporary */ + (void) fclose(fp); +- if (fseek(ft, 0L, SEEK_SET) != 0) ++ if (fseeko(ft, (off_t) 0, SEEK_SET) != 0) + return (NULL) ; + + return (ft); +@@ -129,46 +142,91 @@ FILE *seekable(FILE *fp) + } + + +-/* copy input file from current position upto new position to output file */ +-static int fcopy(long upto) +-{ +- long here = ftell(infile); +- while (here < upto) { +- if ((fgets(buffer, BUFSIZ, infile) == NULL) || +- (fputs(buffer, outfile) == EOF)) +- return(0); +- here = ftell(infile); +- bytes += strlen(buffer); +- } +- return (1); ++/* copy input file from current position upto new position to output file, ++ * ignoring the lines starting at something ignorelist points to */ ++static int fcopy(off_t upto, off_t *ignorelist) ++{ ++ off_t here = ftello(infile); ++ off_t bytes_left; ++ ++ if (ignorelist != NULL) { ++ while (*ignorelist > 0 && *ignorelist < here) ++ ignorelist++; ++ ++ while (*ignorelist > 0 && *ignorelist < upto) { ++ int r = fcopy(*ignorelist, NULL); ++ if (!r || fgets(buffer, BUFSIZ, infile) == NULL) ++ return 0; ++ ignorelist++; ++ here = ftello(infile); ++ while (*ignorelist > 0 && *ignorelist < here) ++ ignorelist++; ++ } ++ } ++ bytes_left = upto - here; ++ ++ while (bytes_left > 0) { ++ size_t rw_result; ++ const size_t numtocopy = (bytes_left > BUFSIZ) ? BUFSIZ : bytes_left; ++ rw_result = fread(buffer, 1, numtocopy, infile); ++ if (rw_result < numtocopy) return (0); ++ rw_result = fwrite(buffer, 1, numtocopy, outfile); ++ if (rw_result < numtocopy) return (0); ++ bytes_left -= numtocopy; ++ bytes += numtocopy; ++ } ++ return (1); + } + + /* build array of pointers to start/end of pages */ +-void scanpages(void) ++void scanpages(off_t *sizeheaders) + { + register char *comment = buffer+2; + register int nesting = 0; +- register long int record; ++ register off_t record; ++ ++ if (sizeheaders) ++ *sizeheaders = 0; + +- if ((pageptr = (long *)malloc(sizeof(long)*maxpages)) == NULL) ++ if ((pageptr = (off_t *)malloc(sizeof(off_t)*maxpages)) == NULL) + message(FATAL, "out of memory\n"); + pages = 0; +- fseek(infile, 0L, SEEK_SET); +- while (record = ftell(infile), fgets(buffer, BUFSIZ, infile) != NULL) ++ fseeko(infile, (off_t) 0, SEEK_SET); ++ while (record = ftello(infile), fgets(buffer, BUFSIZ, infile) != NULL) + if (*buffer == '%') { + if (buffer[1] == '%') { + if (nesting == 0 && iscomment(comment, "Page:")) { + if (pages >= maxpages-1) { + maxpages *= 2; +- if ((pageptr = (long *)realloc((char *)pageptr, +- sizeof(long)*maxpages)) == NULL) ++ if ((pageptr = (off_t *)realloc((char *)pageptr, ++ sizeof(off_t)*maxpages)) == NULL) + message(FATAL, "out of memory\n"); + } + pageptr[pages++] = record; ++ } else if (headerpos == 0 && iscomment(comment, "BoundingBox:")) { ++ if (sizeheaders) { ++ *(sizeheaders++) = record; ++ *sizeheaders = 0; ++ } ++ } else if (headerpos == 0 && iscomment(comment, "HiResBoundingBox:")) { ++ if (sizeheaders) { ++ *(sizeheaders++) = record; ++ *sizeheaders = 0; ++ } ++ } else if (headerpos == 0 && iscomment(comment,"DocumentPaperSizes:")) { ++ if (sizeheaders) { ++ *(sizeheaders++) = record; ++ *sizeheaders = 0; ++ } ++ } else if (headerpos == 0 && iscomment(comment,"DocumentMedia:")) { ++ if (sizeheaders) { ++ *(sizeheaders++) = record; ++ *sizeheaders = 0; ++ } + } else if (headerpos == 0 && iscomment(comment, "Pages:")) + pagescmt = record; + else if (headerpos == 0 && iscomment(comment, "EndComments")) +- headerpos = ftell(infile); ++ headerpos = ftello(infile); + else if (iscomment(comment, "BeginDocument") || + iscomment(comment, "BeginBinary") || + iscomment(comment, "BeginFile")) +@@ -180,23 +238,23 @@ void scanpages(void) + else if (nesting == 0 && iscomment(comment, "EndSetup")) + endsetup = record; + else if (nesting == 0 && iscomment(comment, "BeginProlog")) +- headerpos = ftell(infile); ++ headerpos = ftello(infile); + else if (nesting == 0 && + iscomment(comment, "BeginProcSet: PStoPS")) + beginprocset = record; + else if (beginprocset && !endprocset && + iscomment(comment, "EndProcSet")) +- endprocset = ftell(infile); ++ endprocset = ftello(infile); + else if (nesting == 0 && (iscomment(comment, "Trailer") || + iscomment(comment, "EOF"))) { +- fseek(infile, record, SEEK_SET); ++ fseeko(infile, record, SEEK_SET); + break; + } + } else if (headerpos == 0 && buffer[1] != '!') + headerpos = record; + } else if (headerpos == 0) + headerpos = record; +- pageptr[pages] = ftell(infile); ++ pageptr[pages] = ftello(infile); + if (endsetup == 0 || endsetup > pageptr[0]) + endsetup = pageptr[0]; + } +@@ -204,7 +262,7 @@ void scanpages(void) + /* seek a particular page */ + void seekpage(int p) + { +- fseek(infile, pageptr[p], SEEK_SET); ++ fseeko(infile, pageptr[p], SEEK_SET); + if (fgets(buffer, BUFSIZ, infile) != NULL && + iscomment(buffer, "%%Page:")) { + char *start, *end; +@@ -268,7 +326,7 @@ void writepagesetup(void) + /* write the body of a page */ + void writepagebody(int p) + { +- if (!fcopy(pageptr[p+1])) ++ if (!fcopy(pageptr[p+1], NULL)) + message(FATAL, "I/O error writing page %d\n", outputpage); + } + +@@ -281,26 +339,37 @@ void writepage(int p) + } + + /* write from start of file to end of header comments */ +-void writeheader(int p) ++void writeheader(int p, off_t *ignore) + { +- fseek(infile, 0L, SEEK_SET); ++ writeheadermedia(p, ignore, -1, -1); ++} ++ ++void writeheadermedia(int p, off_t *ignore, double width, double height) ++{ ++ fseeko(infile, (off_t) 0, SEEK_SET); + if (pagescmt) { +- if (!fcopy(pagescmt) || fgets(buffer, BUFSIZ, infile) == NULL) ++ if (!fcopy(pagescmt, ignore) || fgets(buffer, BUFSIZ, infile) == NULL) + message(FATAL, "I/O error in header\n"); ++ if (width > -1 && height > -1) { ++ sprintf(buffer, "%%%%DocumentMedia: plain %d %d 0 () ()\n", (int) width, (int) height); ++ writestring(buffer); ++ sprintf(buffer, "%%%%BoundingBox: 0 0 %d %d\n", (int) width, (int) height); ++ writestring(buffer); ++ } + sprintf(buffer, "%%%%Pages: %d 0\n", p); + writestring(buffer); + } +- if (!fcopy(headerpos)) ++ if (!fcopy(headerpos, ignore)) + message(FATAL, "I/O error in header\n"); + } + + /* write prologue to end of setup section excluding PStoPS procset */ + int writepartprolog(void) + { +- if (beginprocset && !fcopy(beginprocset)) ++ if (beginprocset && !fcopy(beginprocset, NULL)) + message(FATAL, "I/O error in prologue\n"); + if (endprocset) +- fseek(infile, endprocset, SEEK_SET); ++ fseeko(infile, endprocset, SEEK_SET); + writeprolog(); + return !beginprocset; + } +@@ -308,21 +377,21 @@ int writepartprolog(void) + /* write prologue up to end of setup section */ + void writeprolog(void) + { +- if (!fcopy(endsetup)) ++ if (!fcopy(endsetup, NULL)) + message(FATAL, "I/O error in prologue\n"); + } + + /* write from end of setup to start of pages */ + void writesetup(void) + { +- if (!fcopy(pageptr[0])) ++ if (!fcopy(pageptr[0], NULL)) + message(FATAL, "I/O error in prologue\n"); + } + + /* write trailer */ + void writetrailer(void) + { +- fseek(infile, pageptr[pages], SEEK_SET); ++ fseeko(infile, pageptr[pages], SEEK_SET); + while (fgets(buffer, BUFSIZ, infile) != NULL) { + writestring(buffer); + } +diff -rupN psutils/psutil.h psutils-new/psutil.h +--- psutils/psutil.h 1997-03-11 23:53:04.000000000 +0100 ++++ psutils-new/psutil.h 2014-04-09 21:19:57.066001335 +0200 +@@ -4,7 +4,7 @@ + * + * utilities for PS programs + */ +- ++#define _FILE_OFFSET_BITS 64 + #include + #include + #include +@@ -25,20 +25,21 @@ typedef struct papersize { + #define PaperHeight(p) ((p)->height) + + /* Definitions for functions found in psutil.c */ +-extern Paper *findpaper(char *name); ++extern Paper *findpaper(const char *name); + extern FILE *seekable(FILE *fp); + extern void writepage(int p); + extern void seekpage(int p); + extern void writepageheader(char *label, int p); + extern void writepagesetup(void); + extern void writepagebody(int p); +-extern void writeheader(int p); ++extern void writeheader(int p, off_t *ignorelist); ++extern void writeheadermedia(int p, off_t *ignorelist, double width, double height); + extern int writepartprolog(void); + extern void writeprolog(void); + extern void writesetup(void); + extern void writetrailer(void); + extern void writeemptypage(void); +-extern void scanpages(void); ++extern void scanpages(off_t *sizeheaders); + extern void writestring(char *s); + + /* These variables are imported from the client program (e.g. psbook, psnup, +diff -rupN psutils/showchar.man psutils-new/showchar.man +--- psutils/showchar.man 1970-01-01 01:00:00.000000000 +0100 ++++ psutils-new/showchar.man 2014-04-09 21:18:34.694003468 +0200 +@@ -0,0 +1,26 @@ ++.TH SHOWCHAR 1 "PSUtils Release @RELEASE@ Patchlevel @PATCHLEVEL@" ++.SH NAME ++showchar \- show character with information ++.SH SYNOPSIS ++.B showchar ++[ ++.B fontname ++] [ ++.B charname ++] ++.SH DESCRIPTION ++This manual page was written for the Debian GNU/Linux distribution ++because the original program does not have a manual page. ++.PP ++.B showchar ++outputs PostScript to draw a character with metric info. ++.SH AUTHOR ++Copyright (C) Angus J. C. Duggan 1991-1995 ++.PP ++This manual page was written by Uwe Hermann , ++for the Debian GNU/Linux system (but may be used by others). ++.SH TRADEMARKS ++.B PostScript ++is a trademark of Adobe Systems Incorporated. ++.SH "SEE ALSO" ++@MAN@ diff --git a/srcpkgs/psutils/template b/srcpkgs/psutils/template new file mode 100644 index 00000000000..294a901db8e --- /dev/null +++ b/srcpkgs/psutils/template @@ -0,0 +1,36 @@ +# Template file for 'psutils' +pkgname="psutils" +version="p17" +revision=1 +build_style=gnu-makefile +short_desc="Set of utilities to manipulate PostScript files" +maintainer="Carlo Dormeletti " +license="AJCD-License" +hostmakedepends="perl " +makedepends="ghostscript" +depends="ghostscript" +homepage="http://knackered.org/angus/psutils/" +wrksrc="/psutils" +distfiles="ftp://ftp.knackered.org/pub/psutils/${pkgname}-${version}.tar.gz" +checksum="3853eb79584ba8fbe27a815425b65a9f7f15b258e0d43a05a856bdb75d588ae4" +patch_args="-Np1" + +pre_configure() { + # install in /usr instead of /usr/local + sed 's@/usr/local@/usr@g' Makefile.unix > Makefile +} + +do_build() { + make +} + +do_install() { + make DESTDIR=${DESTDIR} install + + vinstall LICENSE 644 usr/share/licenses/${pkgname} + + vinstall LICENSE 644 usr/share/${pkgname} + vinstall README 644 usr/share/${pkgname} + vinstall README.voidlinux 644 usr/share/${pkgname} + +} \ No newline at end of file