Old mpage.h
1 /*
2 * mpage.h
3 */
4
5 /*
6 * mpage: A program to reduce pages of print so that several pages
7 * of output appear on one sheet of paper.
8 *
9 * Copyright (c) 1994-2004 Marcel J.E. Mol, The Netherlands
10 * Copyright (c) 1988 Mark P. Hahn, Herndon, Virginia
11 *
12 *
13 * Permission is granted to anyone to make or distribute verbatim
14 * copies of this document as received, in any medium, provided
15 * that this copyright notice is preserved, and that the
16 * distributor grants the recipient permission for further
17 * redistribution as permitted by this notice.
18 *
19 */
20
21 /*
22 * Through-out the program comments I have tried to refer to pages a the
23 * logical printed page of text that gets reduced. Sheets refer to physical
24 * pieces of paper. Hence, mulitple pages appear on a sheet. "page" is a
25 * logical or virtual entity, and "sheet" is physical entity.
26 */
27
28 #include <unistd.h>
29 #include <stdlib.h>
30 #include <stdio.h>
31 #include <limits.h>
32 #include <string.h>
33
34 #define VERSION "2.5.5 November 2006"
35
36 #define TRUE 1
37 #define FALSE 0
38
39 #define LINESIZE 1024
40
41 #define FILE_CONT 0
42 #define FILE_EOF 1
43 #define FILE_MORE 2
44
45 #define LINE_MORE 5
46 #define LINE_EOF_NOW 4
47 #define LINE_EOF 3
48 #define LINE_OVERPRINT 2
49 #define LINE_BLANK 1
50
51 #define SKIP_PS 1
52 #define STORE_PS 2
53 #define FLUSH_PS 3
54
55 #define TSIZE 12
56 #define HSIZE TSIZE+2
57
58 #define DEFAULTPMARGIN 4
59
60 #if !defined(DEFAULTSMARGIN)
61 # define DEFAULTSMARGIN 20
62 #endif
63
64 #define DEFAULTTMARGIN 0
65 #define DEFAULTTABSTOP 8
66
67 #if !defined(MAXINT)
68 # ifdef INT_MAX
69 # define MAXINT INT_MAX
70 # else
71 # define MAXINT (1 << 30)
72 # endif
73 #endif
74
75 #if !defined(DEFAULT_ENCODING)
76 # define DEFAULT_ENCODING 0
77 #endif
78
79 #define MAXJARG 100
80
81 /*
82 * to turn on debugging, define the preprocessor macro DEBUG and set
83 * the variable Debug_flag to the sum of the sections to debug.
84 */
85 # ifdef DEBUG
86 # define Debug(f,s,a) if (Debug_flag & f) printf(s,a)
87 # define DB_GETLINE 0x0000001
88 # define DB_ONEPAGE 0x0000002
89 # define DB_STDIN 0x0000004
90 # define DB_PSDOC 0x0000008
91 # define DB_PSPAGE 0x0000010
92 # define DB_PSCHECK 0x0000020
93 # define DB_PSROFF 0x0000040
94 # define DB_PSMPAGE 0x0000080
95 # define DB_POINTS 0x0000100
96 # define DB_POST 0x0000200
97 # define DB_UNUSED 0x0000400
98 extern int Debug_flag;
99 extern int errno;
100 # else
101 # define Debug(f,s,a)
102 # endif /* DEBUG */
103
104 /*
105 * definitions for sorting out types of postscript input
106 */
107 # define PS_NONE 0
108 # define PS_PSROFF 1
109 # define PS_MPAGE 2
110 # define PS_CONFORM 3
111 # define PS_OTHER 4
112 # define PS_MSWINDOWS 5
113 # define PS_TEX 6
114 # define PS_TEX2 7
115
116
117 /*
118 * Input file type selection types
119 */
120 # define IN_AUTO 0
121 # define IN_ASCII 1
122 # define IN_PS 2
123
124
125 /*
126 * set default page size
127 */
128 #if !defined(PAGE_DEF)
129 # define PAGE_DEF "A4"
130 #endif
131
132 /*
133 * define print spooler types
134 */
135 #define ATT_SPOOLER 1
136 #define BSD_SPOOLER 2
137 #if !defined(SPOOLER)
138 # define SPOOLER BSD_SPOOLER
139 #endif
140
141 /*
142 * printing definitions
143 */
144 #if !defined(PRPROG)
145 # define PRPROG "pr"
146 #endif
147 #if !defined(PRINTPROG)
148 # if SPOOLER == ATT_SPOOLER
149 # define PRINTPROG "lp"
150 # else /* BSD_SPOOLER */
151 # define PRINTPROG "lpr"
152 # endif
153 #endif
154 #if !defined(QUEARG)
155 # if SPOOLER == ATT_SPOOLER
156 # define QUEARG "-d"
157 # else /* BSD_SPOOLER */
158 # define QUEARG "-P"
159 # endif
160 #endif
161
162 /*
163 * "Conforming" postscript flag string (remember ps_check strips
164 * the "%!" flag from PS files
165 */
166 # define PS_FLAG "PS"
167 # define PS_FLAG2 "-Adobe-"
168
169 /*
170 * a sheet describes the measurements and orientatation of a page for
171 * use in constructing a sheet preabmles.
172 */
173 struct sheet {
174 int sh_cwidth; /* number of characters across a page */
175 int sh_plength; /* number of lines down a page */
176 int (*sh_width)(); /* postscript width across a printed page */
177 int (*sh_height)(); /* postscript height of a printed page */
178 int sh_rotate; /* angle to rotate the page */
179 void (*sh_outline)(); /* text to print as outline for */
180 /* the printed sheet*/
181 struct pagepoints *sh_pagepoints; /* where to put pages on */
182 /* the printed sheet */
183 };
184
185 /*
186 * simple x and y coordinates for putting pages of output on printed sheet
187 * skip to skip this page???
188 */
189 struct pagepoints {
190 int (*pp_origin_x)();
191 int (*pp_origin_y)();
192 int skip;
193 };
194
195
196 /*
197 * Definition of an optional annotate box around part of text
198 */
199 struct pagebox {
200 int over; /* over from the left column */
201 int lift; /* lift from the bottom line */
202 int wide; /* columns wide */
203 int high; /* lines high */
204 int thick;/* line thickness */
205 };
206
207
208 /*
209 * Structure to describe a physical piece of paper, e.g. A4 or Letter
210 */
211 struct page_desc {
212 char *media;
213 int width;
214 int height;
215 };
216
217 /*
218 * some basic PS parameters
219 */
220 extern int ps_width; /* number of points in the X direction (8.5 inches) */
221 extern int ps_height; /* number of points in the Y direction (11 inches) */
222 extern char * media; /* name of output page media */
223
224
225 extern struct page_desc paper[];
226
227 /* array of sheets where pages are ordered for coli ??? */
228 extern struct sheet coli[];
229
230 /* array of sheets where pages are ordered for left to right reading */
231 extern struct sheet *left_right[];
232
233 /* arrays for sheets where pages are ordered for top to bottom reading */
234 extern struct sheet *up_down[];
235
236 /* definitions for aspect and reading directions */
237 # define PORTRAIT 0
238 # define LANDSCAPE 1
239 # define LANDSCAPE_PORTRAIT 2
240 # define UPDOWN 0
241 # define LEFTRIGHT 1
242
243 /*
244 * Variables for holding the chosen options, The defaults are set here.
245 * the sheetlist pointer is set to point to the array for either up/down
246 * or left/right reading. This array is index by sheetorder, and then
247 * sheetindex. sheetindex encodes the number of reduced pages per printed
248 * sheet and indexes into the sheet list (0 = 1 page, 1 = two pages, 2 =
249 * four pages, 3 = eight pages).
250 */
251 extern struct sheet **sheetlist;/* array of sheet lists (up/down or left/right) */
252 extern int sheetaspect; /* either normal or landscape */
253 extern int sheetorder; /* up/down or left/right flag */
254 extern int sheetindex; /* index to number of pages of sheet */
255 extern int sheetmargin_left; /* non-printable border on sheet */
256 extern int sheetmargin_right; /* non-printable border on sheet */
257 extern int sheetmargin_top; /* non-printable border on sheet */
258 extern int sheetmargin_bottom; /* non-printable border on sheet */
259 extern int pagemargin_left; /* border for pages */
260 extern int pagemargin_right; /* border for pages */
261 extern int pagemargin_top; /* border for pages */
262 extern int pagemargin_bottom; /* border for pages */
263 extern int textmargin_left; /* border for textbox */
264 extern int textmargin_right; /* border for textbox */
265 extern int textmargin_top; /* border for textbox */
266 extern int textmargin_bottom; /* border for textbox */
267 extern int sheetheader_left; /* space for physical sheetheader */
268 extern int sheetheader_right; /* space for physical sheetheader */
269 extern int sheetheader_top; /* space for physical sheetheader */
270 extern int sheetheader_bottom; /* space for physical sheetheader */
271
272 extern struct pagepoints *points;
273 extern int orientation; /* final orientation of text */
274 extern int fsize; /* font scale size */
275 extern int opt_pr; /* boolean, if true use pr to format output */
276 extern int opt_tabstop; /* define tabstop width */
277 extern int opt_indent; /* starting column for text printing */
278 extern int opt_lines; /* number of lines to fit on an reduced page */
279 extern int opt_killtrail; /* stop reading input on %%TRailer */
280 extern int opt_width; /* number of columns to fit on reduced page */
281 extern int opt_mp_header; /* let mpage create a header */
282 extern int opt_sheetheader; /* let mpage create sheetheaders */
283 extern char * opt_page; /* sheets size: a4 or us letter */
284 extern int opt_fold; /* fold long lines */
285 extern int opt_outline; /* print a nice outline around pages */
286 extern int opt_verbose; /* print a count of pages sent to printer */
287 extern int opt_square; /* Make pages with same aspect as sheets */
288 extern int opt_reverse; /* Print sheets in reverse order */
289 extern int opt_jarg; /* Number of -j arg sets */
290 extern int opt_first[MAXJARG]; /* First sheet # to print, 1 = first */
291 extern int opt_last[MAXJARG]; /* Last sheet # to print, 0 = EOF */
292 extern int opt_alt[MAXJARG]; /* Print every Nth sheet */
293 extern int opt_file; /* should each file appera on a new sheet */
294 extern int opt_duplex; /* duplex mode*/
295 extern int opt_tumble; /* tumble every second pages */
296 extern int opt_textbox; /* print a nice box box around text*/
297 extern int opt_input; /* set input file type */
298 extern int opt_encoding; /* use default encoding or not */
299
300 extern struct pagebox textbox;
301
302
303 extern char * opt_header; /* the header for pr's -h option */
304 extern char * printque; /* the printer queuename */
305 extern char * prprog; /* the pr filter program */
306 extern char * printprog; /* the print program */
307 extern char * printarg; /* define print queue to printprog */
308 extern int doprint; /* send output to printer or not */
309 extern char * charvec_file; /* file to read character definitions from */
310 extern char * libdir; /* pointer to get library files from */
311 extern char * fontname; /* Font to use */
312 extern char * dateformat; /* Date/time format for headers */
313 extern char * sheethead; /* Header for each physical page */
314
315
316 /*
317 * various global information
318 */
319 extern char MPAGE[]; /* program name */
320 extern int ps_pagenum; /* current page count (printed or not) */
321 extern int ps_outpages; /* pages printed */
322 extern int had_ps; /* did we process ps files */
323 extern int first_encoding; /* first encoding in character set */
324 extern int last_encoding; /* last encoding in character set */
325 extern int mpage_level; /* keep track of multilevel mpaga calls */
326 extern int Coli; /* value of 0=don't mess, 1 = 4,1 (outside pages), */
327 extern int use_utf8; /* is the input UTF-8 or not */
328 extern int check_utf8; /* do we want tocheck for UTF-8 or not */
329
330
331
332 /* args.c */
333 int do_args();
334 int do_env();
335 /* file.c */
336 void do_file();
337 void do_pr_file();
338 void do_stdin();
339 void do_sheets();
340 /* glob.c */
341 void usage();
342 /* page.c */
343 void set_page();
344 int select_pagetype();
345 void show_pagetypes();
346 int xbase1(), xbase2();
347 int ybase1(), ybase2(), ybase3(), ybase4();
348 int ytop1(), ytop2(), ytop3(), ytop4();
349 int xwid1(), xwid2();
350 int yht1(), yht2(), yht4();
351 void outline_1();
352 void outline_2();
353 void outline_4();
354 void outline_8();
355 void sheetheader();
356 void mp_outline();
357 /* post.c */
358 int ps_check();
359 void do_ps_doc();
360 /* text.c */
361 void do_text_doc();
362 /* util.c */
363 void memgets_init();
364 char *memgets();
365
366 /*
367 * For OS/2
368 */
369 #ifdef __EMX__
370 # define strcasecmp stricmp
371 #endif
372
373 /*
374 * For Amiga
375 */
376 #ifdef AMIGA
377 # define popen fopen
378 # define pclose fclose
379 # define strcasecmp stricmp
380 #endif
381