/* * mpage.h */ /* * mpage: A program to reduce pages of print so that several pages * of output appear on one sheet of paper. * * Copyright (c) 1994-2004 Marcel J.E. Mol, The Netherlands * Copyright (c) 1988 Mark P. Hahn, Herndon, Virginia * * * Permission is granted to anyone to make or distribute verbatim * copies of this document as received, in any medium, provided * that this copyright notice is preserved, and that the * distributor grants the recipient permission for further * redistribution as permitted by this notice. * */ /* * Through-out the program comments I have tried to refer to pages a the * logical printed page of text that gets reduced. Sheets refer to physical * pieces of paper. Hence, mulitple pages appear on a sheet. "page" is a * logical or virtual entity, and "sheet" is physical entity. */ #include #include #include #include #include #define VERSION "2.5.6 Januari 2008" #define TRUE 1 #define FALSE 0 #define LINESIZE 1024 #define FILE_CONT 0 #define FILE_EOF 1 #define FILE_MORE 2 #define LINE_MORE 5 #define LINE_EOF_NOW 4 #define LINE_EOF 3 #define LINE_OVERPRINT 2 #define LINE_BLANK 1 #define SKIP_PS 1 #define STORE_PS 2 #define FLUSH_PS 3 #define TSIZE 12 #define HSIZE TSIZE+2 #define DEFAULTPMARGIN 4 #if !defined(DEFAULTSMARGIN) # define DEFAULTSMARGIN 20 #endif #define DEFAULTTMARGIN 0 #define DEFAULTTABSTOP 8 #if !defined(MAXINT) # ifdef INT_MAX # define MAXINT INT_MAX # else # define MAXINT (1 << 30) # endif #endif #if !defined(DEFAULT_ENCODING) # define DEFAULT_ENCODING 0 #endif #define MAXJARG 100 /* * to turn on debugging, define the preprocessor macro DEBUG and set * the variable Debug_flag to the sum of the sections to debug. */ # ifdef DEBUG # define Debug(f,s,a) if (Debug_flag & f) printf(s,a) # define DB_GETLINE 0x0000001 # define DB_ONEPAGE 0x0000002 # define DB_STDIN 0x0000004 # define DB_PSDOC 0x0000008 # define DB_PSPAGE 0x0000010 # define DB_PSCHECK 0x0000020 # define DB_PSROFF 0x0000040 # define DB_PSMPAGE 0x0000080 # define DB_POINTS 0x0000100 # define DB_POST 0x0000200 # define DB_UNUSED 0x0000400 extern int Debug_flag; extern int errno; # else # define Debug(f,s,a) # endif /* DEBUG */ /* * definitions for sorting out types of postscript input */ # define PS_NONE 0 # define PS_PSROFF 1 # define PS_MPAGE 2 # define PS_CONFORM 3 # define PS_OTHER 4 # define PS_MSWINDOWS 5 # define PS_TEX 6 # define PS_TEX2 7 /* * Input file type selection types */ # define IN_AUTO 0 # define IN_ASCII 1 # define IN_PS 2 /* * set default page size */ #if !defined(PAGE_DEF) # define PAGE_DEF "A4" #endif /* * define print spooler types */ #define ATT_SPOOLER 1 #define BSD_SPOOLER 2 #if !defined(SPOOLER) # define SPOOLER BSD_SPOOLER #endif /* * printing definitions */ #if !defined(PRPROG) # define PRPROG "pr" #endif #if !defined(PRINTPROG) # if SPOOLER == ATT_SPOOLER # define PRINTPROG "lp" # else /* BSD_SPOOLER */ # define PRINTPROG "lpr" # endif #endif #if !defined(QUEARG) # if SPOOLER == ATT_SPOOLER # define QUEARG "-d" # else /* BSD_SPOOLER */ # define QUEARG "-P" # endif #endif /* * "Conforming" postscript flag string (remember ps_check strips * the "%!" flag from PS files */ # define PS_FLAG "PS" # define PS_FLAG2 "-Adobe-" /* * a sheet describes the measurements and orientatation of a page for * use in constructing a sheet preabmles. */ struct sheet { int sh_cwidth; /* number of characters across a page */ int sh_plength; /* number of lines down a page */ int (*sh_width)(); /* postscript width across a printed page */ int (*sh_height)(); /* postscript height of a printed page */ int sh_rotate; /* angle to rotate the page */ void (*sh_outline)(); /* text to print as outline for */ /* the printed sheet*/ struct pagepoints *sh_pagepoints; /* where to put pages on */ /* the printed sheet */ }; /* * simple x and y coordinates for putting pages of output on printed sheet * skip to skip this page??? */ struct pagepoints { int (*pp_origin_x)(); int (*pp_origin_y)(); int skip; }; /* * Definition of an optional annotate box around part of text */ struct pagebox { int over; /* over from the left column */ int lift; /* lift from the bottom line */ int wide; /* columns wide */ int high; /* lines high */ int thick;/* line thickness */ }; /* * Structure to describe a physical piece of paper, e.g. A4 or Letter */ struct page_desc { char *media; int width; int height; }; /* * some basic PS parameters */ extern int ps_width; /* number of points in the X direction (8.5 inches) */ extern int ps_height; /* number of points in the Y direction (11 inches) */ extern char * media; /* name of output page media */ extern struct page_desc paper[]; /* array of sheets where pages are ordered for coli ??? */ extern struct sheet coli[]; /* array of sheets where pages are ordered for left to right reading */ extern struct sheet *left_right[]; /* arrays for sheets where pages are ordered for top to bottom reading */ extern struct sheet *up_down[]; /* definitions for aspect and reading directions */ # define PORTRAIT 0 # define LANDSCAPE 1 # define LANDSCAPE_PORTRAIT 2 # define UPDOWN 0 # define LEFTRIGHT 1 /* * Variables for holding the chosen options, The defaults are set here. * the sheetlist pointer is set to point to the array for either up/down * or left/right reading. This array is index by sheetorder, and then * sheetindex. sheetindex encodes the number of reduced pages per printed * sheet and indexes into the sheet list (0 = 1 page, 1 = two pages, 2 = * four pages, 3 = eight pages). */ extern struct sheet **sheetlist;/* array of sheet lists (up/down or left/right) */ extern int sheetaspect; /* either normal or landscape */ extern int sheetorder; /* up/down or left/right flag */ extern int sheetindex; /* index to number of pages of sheet */ extern int sheetmargin_left; /* non-printable border on sheet */ extern int sheetmargin_right; /* non-printable border on sheet */ extern int sheetmargin_top; /* non-printable border on sheet */ extern int sheetmargin_bottom; /* non-printable border on sheet */ extern int pagemargin_left; /* border for pages */ extern int pagemargin_right; /* border for pages */ extern int pagemargin_top; /* border for pages */ extern int pagemargin_bottom; /* border for pages */ extern int textmargin_left; /* border for textbox */ extern int textmargin_right; /* border for textbox */ extern int textmargin_top; /* border for textbox */ extern int textmargin_bottom; /* border for textbox */ extern int sheetheader_left; /* space for physical sheetheader */ extern int sheetheader_right; /* space for physical sheetheader */ extern int sheetheader_top; /* space for physical sheetheader */ extern int sheetheader_bottom; /* space for physical sheetheader */ extern struct pagepoints *points; extern int orientation; /* final orientation of text */ extern int fsize; /* font scale size */ extern int opt_pr; /* boolean, if true use pr to format output */ extern int opt_tabstop; /* define tabstop width */ extern int opt_indent; /* starting column for text printing */ extern int opt_lines; /* number of lines to fit on an reduced page */ extern int opt_killtrail; /* stop reading input on %%TRailer */ extern int opt_width; /* number of columns to fit on reduced page */ extern int opt_mp_header; /* let mpage create a header */ extern int opt_sheetheader; /* let mpage create sheetheaders */ extern char * opt_page; /* sheets size: a4 or us letter */ extern int opt_fold; /* fold long lines */ extern int opt_outline; /* print a nice outline around pages */ extern int opt_verbose; /* print a count of pages sent to printer */ extern int opt_square; /* Make pages with same aspect as sheets */ extern int opt_reverse; /* Print sheets in reverse order */ extern int opt_jarg; /* Number of -j arg sets */ extern int opt_first[MAXJARG]; /* First sheet # to print, 1 = first */ extern int opt_last[MAXJARG]; /* Last sheet # to print, 0 = EOF */ extern int opt_alt[MAXJARG]; /* Print every Nth sheet */ extern int opt_file; /* should each file appera on a new sheet */ extern int opt_duplex; /* duplex mode*/ extern int opt_tumble; /* tumble every second pages */ extern int opt_textbox; /* print a nice box box around text*/ extern int opt_input; /* set input file type */ extern int opt_encoding; /* use default encoding or not */ extern struct pagebox textbox; extern char * opt_header; /* the header for pr's -h option */ extern char * printque; /* the printer queuename */ extern char * prprog; /* the pr filter program */ extern char * printprog; /* the print program */ extern char * printarg; /* define print queue to printprog */ extern int doprint; /* send output to printer or not */ extern char * charvec_file; /* file to read character definitions from */ extern char * libdir; /* pointer to get library files from */ extern char * fontname; /* Font to use */ extern char * dateformat; /* Date/time format for headers */ extern char * sheethead; /* Header for each physical page */ /* * various global information */ extern char MPAGE[]; /* program name */ extern int ps_pagenum; /* current page count (printed or not) */ extern int ps_outpages; /* pages printed */ extern int had_ps; /* did we process ps files */ extern int first_encoding; /* first encoding in character set */ extern int last_encoding; /* last encoding in character set */ extern int mpage_level; /* keep track of multilevel mpaga calls */ extern int Coli; /* value of 0=don't mess, 1 = 4,1 (outside pages), */ extern int use_utf8; /* is the input UTF-8 or not */ extern int check_utf8; /* do we want tocheck for UTF-8 or not */ /* args.c */ int do_args(); int do_env(); /* file.c */ void do_file(); void do_pr_file(); void do_stdin(); void do_sheets(); /* glob.c */ void usage(); /* page.c */ void check_papersize(); void set_page(); int select_pagetype(); void show_pagetypes(); int xbase1(), xbase2(); int ybase1(), ybase2(), ybase3(), ybase4(); int ytop1(), ytop2(), ytop3(), ytop4(); int xwid1(), xwid2(); int yht1(), yht2(), yht4(); void outline_1(); void outline_2(); void outline_4(); void outline_8(); void sheetheader(); void mp_outline(); /* post.c */ int ps_check(); void do_ps_doc(); /* text.c */ void do_text_doc(); /* util.c */ void memgets_init(); char *memgets(); /* * For OS/2 */ #ifdef __EMX__ # define strcasecmp stricmp #endif /* * For Amiga */ #ifdef AMIGA # define popen fopen # define pclose fclose # define strcasecmp stricmp #endif