2 * Copyright (C) Angus J. C. Duggan 1991-1995
3 * See file LICENSE for details.
5 * rearrange pages in conforming PS file for printing in signatures
8 * pstops [-q] [-b] [-d] [-w<dim>] [-h<dim>] [-ppaper] <pagespecs> [infile [outfile]]
21 char pagelabel
[BUFSIZ
] ;
26 fprintf(stderr
, "%s release %d patchlevel %d\n", program
, RELEASE
, PATCHLEVEL
);
27 fprintf(stderr
, "Copyright (C) Angus J. C. Duggan, 1991-1995. See file LICENSE for details.\n");
28 fprintf(stderr
, "Usage: %s [-q] [-b] [-wwidth] [-hheight] [-dlwidth] [-ppaper] <pagespecs> [infile [outfile]]\n",
34 static void argerror(void)
36 fprintf(stderr
, "%s: page specification error:\n", program
);
37 fprintf(stderr
, " <pagespecs> = [modulo:]<spec>\n");
38 fprintf(stderr
, " <spec> = [-]pageno[@scale][L|R|U][(xoff,yoff)][,spec|+spec]\n");
39 fprintf(stderr
, " modulo>=1, 0<=pageno<modulo\n");
44 static int modulo
= 1;
45 static int pagesperspec
= 1;
47 static PageSpec
*parsespecs(char *str
)
49 PageSpec
*head
, *tail
;
53 head
= tail
= newspec();
56 num
= parseint(&str
, argerror
);
60 if (other
|| head
!= tail
|| num
< 1) argerror();
65 tail
->reversed
= !tail
->reversed
;
68 if (num
< 0) argerror();
69 tail
->scale
*= parsedouble(&str
, argerror
);
74 tail
->flags
|= ROTATE
;
78 tail
->flags
|= ROTATE
;
82 tail
->flags
|= ROTATE
;
85 tail
->xoff
+= parsedimen(&str
, argerror
);
86 if (*str
++ != ',') argerror();
87 tail
->yoff
+= parsedimen(&str
, argerror
);
88 if (*str
++ != ')') argerror();
89 tail
->flags
|= OFFSET
;
92 tail
->flags
|= ADD_NEXT
;
94 if (num
< 0 || num
>= modulo
) argerror();
95 if ((tail
->flags
& ADD_NEXT
) == 0)
98 tail
->next
= newspec();
115 void main(int argc
, char *argv
[])
117 PageSpec
*specs
= NULL
;
123 if ( (paper
= findpaper(PAPER
)) != (Paper
*)0 ) {
124 width
= (double)PaperWidth(paper
);
125 height
= (double)PaperHeight(paper
);
132 for (program
= *argv
++; --argc
; argv
++) {
133 if (argv
[0][0] == '-') {
134 switch (argv
[0][1]) {
135 case 'q': /* quiet */
138 case 'd': /* draw borders */
140 draw
= singledimen(*argv
+2, argerror
, usage
);
144 case 'b': /* no bind operator */
147 case 'w': /* page width */
148 width
= singledimen(*argv
+2, argerror
, usage
);
150 case 'h': /* page height */
151 height
= singledimen(*argv
+2, argerror
, usage
);
153 case 'p': /* paper type */
154 if ( (paper
= findpaper(*argv
+2)) != (Paper
*)0 ) {
155 width
= (double)PaperWidth(paper
);
156 height
= (double)PaperHeight(paper
);
158 message(FATAL
, "paper size '%s' not recognised\n", *argv
+2);
160 case 'v': /* version */
164 specs
= parsespecs(*argv
);
168 } else if (specs
== NULL
)
169 specs
= parsespecs(*argv
);
170 else if (infile
== stdin
) {
171 if ((infile
= fopen(*argv
, OPEN_READ
)) == NULL
)
172 message(FATAL
, "can't open input file %s\n", *argv
);
173 } else if (outfile
== stdout
) {
174 if ((outfile
= fopen(*argv
, OPEN_WRITE
)) == NULL
)
175 message(FATAL
, "can't open output file %s\n", *argv
);
180 #if defined(MSDOS) || defined(WINNT)
181 if ( infile
== stdin
) {
182 int fd
= fileno(stdin
) ;
183 if ( setmode(fd
, O_BINARY
) < 0 )
184 message(FATAL
, "can't open input file %s\n", argv
[4]);
186 if ( outfile
== stdout
) {
187 int fd
= fileno(stdout
) ;
188 if ( setmode(fd
, O_BINARY
) < 0 )
189 message(FATAL
, "can't reset stdout to binary mode\n");
192 if ((infile
=seekable(infile
))==NULL
)
193 message(FATAL
, "can't seek input\n");
195 pstops(modulo
, pagesperspec
, nobinding
, specs
, draw
);