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