home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / texmf / source / driver / util / amiga / PrintOpt.c < prev    next >
C/C++ Source or Header  |  1991-07-11  |  13KB  |  395 lines

  1.  
  2.  
  3. #define TEX
  4.  
  5. #include <stdarg.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <stddef.h>
  9. #include <string.h>
  10.  
  11. extern struct DosLibrary    *DOSBase;
  12.  
  13. #include <clib/dos_protos.h>
  14. #include <pragmas/dos_pragmas.h>
  15.  
  16. #include "GetOpt.h"
  17. #include "GetOpt.i"
  18.  
  19.  
  20. #include "little_globals.h"
  21. #include "little_globals.i"
  22.  
  23.  
  24.  
  25. extern char *_ProgramName;
  26.  
  27. static void open_logfile    (void);
  28. static void PrintHelp        (struct Options opt[], short long_hlp);
  29. static void check_printer_type    (char *str);
  30.  
  31.  
  32. /*==================================================================*/
  33.  
  34. /* Nur zum Test... */
  35. FILE *pkfile;
  36. long bytestoread;
  37. int   g_authors;        /* print author names                      */
  38. int   g_errenc;                 /* has an error been encountered?          */
  39. char  g_Logname[STRSIZE];       /* name of log file, if created            */
  40. int   g_logging;                /* Are we logging warning messages?        */
  41. int   g_logfile;                /* Are these messages going to a log file? */
  42. FILE *g_logfp;                  /* log file pointer (for errors)           */
  43. char *g_progname;/*!*/      /* program name                            */
  44. int   g_quiet;                  /* for quiet operation                     */
  45. int hoffset, voffset;           /* horizontal and vertical page offset     */
  46. int draft;                      /* quality for hardcopy                    */
  47. int unidirect;                  /* print direction for hardcopy            */
  48. int landscape;            /* print in landscape modus?           */
  49. int iffprint;            /* print to iff-file               */
  50. int full_page_in_ram;        /* must the whole page-bitmap into ram?       */
  51. int printer_type;        /* printer-type for hardcopy           */
  52. int print_width;        /* nr of lines printed per pass           */
  53. int turbo_mode;            /* print in TURBO mode?               */
  54. int os_2;            /* do we work with AMIGA OS 2.0 or greater */
  55. int output_to_file;        /* should output redirected to a file       */
  56. char *output_file_name;        /* name of the output file           */
  57. FILE *output_file_ptr;        /* output file pointer               */
  58. static int print_page_numbers;    /* print: 0=all, 1=odd, 2=even page nrs       */
  59. int Stats;
  60. int bitsperlong, bytesperlong;
  61. char m_string[STRSIZE];         /* messagestring for warnings and fatal errors */
  62. char  *PXLpath = "default";    /* new pxl-area                  */
  63.  
  64.  
  65. int resolution;                 /* resolution */
  66. int hconvresolution;
  67. int vconvresolution;
  68.  
  69. int   FirstPage = -1000000L;    /* first page to print (uses count0)        */
  70. int   LastPage = 1000000L;      /* last page to print                       */
  71. int   CurrentPage = 0;        /* the current page number            */
  72.  
  73. char filename[STRSIZE];                  /* DVI file name                            */
  74.  
  75. long  hconv, vconv;             /* converts DVI units to pixels             */
  76. long  den;                      /* denominator specified in preamble        */
  77. FILE *dvifp  = NULL;            /* DVI file pointer                         */
  78. int   PreLoad = FALSE;          /* preload the font descriptions?           */
  79. long  h;                        /* current horizontal position              */
  80. long  hh = 0L;                  /* current h on device */
  81. long  v;                        /* current vertical position                */
  82. long  vv = 0L;                  /* current v on device */
  83. long  mag;                      /* magnification specified in preamble      */
  84. int   ncopies = 1;              /* number of copies to print                */
  85. long  num;                      /* numerator specified in preamble          */
  86. long  postambleptr;             /* Pointer to the postamble                 */
  87. long  ppagep;                   /* previous page pointer                    */
  88. int   Reverse = FALSE;          /* process DVI pages in reverse order ?     */
  89. char  rootname[STRSIZE];        /* DVI filename without extension           */
  90. int   hmaxdrift;                /* max pixels away from true rounded position */
  91. int   vmaxdrift;                /* max pixels away from true rounded position */
  92. int   thinspace;        /* needet in dvihand.c for rounding   */
  93. int   vertsmallspace;        /* also ^^                  */
  94. double alpha;                   /* conversion ratio, DVI unit per TFM unit */
  95.  
  96. int last_form_feed = TRUE;    /* a FormFeed at the last page?            */
  97.  
  98. int paper_height, paper_width;
  99. int pheight_pt;                /* real height in pt              */
  100. int pwidth_pt;                /* real width in pt              */
  101.  
  102.  
  103. long fontmemsize = FONTMEMSIZE;
  104. long maxbitmapsize = MAXBITMAPSIZE;    /* maximal size of bitmap     */
  105.  
  106. int bufflen;
  107.  
  108. static double hoffset_in;    /* hoffset in inch */
  109. static double voffset_in;    /* voffset in inch */
  110.  
  111. static int        density = 7;
  112.  
  113.  
  114.  
  115. /*==================================================================*/
  116.  
  117.  
  118.  
  119.  
  120. static long help;
  121. static long DebugStats;
  122. static long logging;
  123. static long onlydraft, onlycheap, optimize;
  124. static long odd, even;
  125. static char *printer_str = NULL;
  126. static char *resolution_str = NULL;
  127. static char *filenameptr = NULL;
  128.  
  129.  
  130.  
  131. START_PARAM(opt)
  132.   /* req?      key-name     abbrev  type         variable       help-txt */
  133.   NOREQ_PARAM ("HELP",      "?",    OPT_HELP,    &help,        "print help information", NULL)
  134.   NOREQ_PARAM ("DIRECTORY", "DIR",  OPT_STRING,  &PXLpath,    "dir for fontlibs/pk-files", NULL)
  135.   NOREQ_PARAM ("FONTMEM",   NULL,   OPT_LONG,    &fontmemsize,    "size of the fontmemory", NULL)
  136.   NOREQ_PARAM ("MAXBITMEM", NULL,   OPT_LONG,     &maxbitmapsize,"max size of the bitmap",
  137.         "(0 == unlimited size)")
  138.   NOREQ_PARAM ("PRTBUFFER", NULL,   OPT_LONG,     &bufflen,    "size of the printer buffer", NULL)
  139.   NOREQ_PARAM ("FROM",      "F",    OPT_LONG,    &FirstPage,    "start at page", NULL)
  140.   NOREQ_PARAM ("TO",        "T",    OPT_LONG,    &LastPage,    "stop at page", NULL)
  141.   NOREQ_PARAM ("ODD",       NULL,   OPT_BOOLEAN, &odd,        "print only all 'odd' pages", NULL)
  142.   NOREQ_PARAM ("EVEN",      NULL,   OPT_BOOLEAN, &even,        "print only all 'even' pages", NULL)
  143.   NOREQ_PARAM ("HOFFSET",   "HOFF", OPT_TEX_DIM, &hoffset_in,    "horizontal offset",
  144.         "(unit out of: pt|cm|in|pc|dd|cc|bp|mm|mi|cp)")
  145.   NOREQ_PARAM ("VOFFSET",   "VOFF", OPT_TEX_DIM, &hoffset_in,    "vertical offset",
  146.         "(unit out of: pt|cm|in|pc|dd|cc|bp|mm|mi|cp)")
  147.   NOREQ_PARAM ("PRINTER",   "PRT",  OPT_STRING,  &printer_str,    "printer type",
  148.         "out of Generic, NECP6, EpsFX, EpsLQ, HPDesk")
  149.   NOREQ_PARAM ("OPTIMIZE",  "OPT",  OPT_BOOLEAN, &optimize,    "optimize printer output?",
  150.         "(sometimes produce 'no' otimze the better result)")
  151.   NOREQ_PARAM ("DRAFT",     NULL,   OPT_BOOLEAN, &onlydraft,    "print in draft modus", NULL)
  152.   NOREQ_PARAM ("HQCHEAP",   NULL,   OPT_BOOLEAN, &onlycheap,    "HP DeskJet cheap modus", NULL)
  153.   NOREQ_PARAM ("DENSITY",   "DEN",  OPT_LONG,    &density,    "printer density",
  154.         "(only for the 'generic' printer)")
  155.   NOREQ_PARAM ("BIDIRECT",  NULL,   OPT_BOOLEAN, &unidirect,    "print bidirectional", NULL)
  156.   NOREQ_PARAM ("LANDSCAPE", "LSC",  OPT_BOOLEAN, &landscape,    "print in landscape modus", NULL)
  157.   NOREQ_PARAM ("IFF",       NULL,   OPT_BOOLEAN, &iffprint,    "print pages to IFF-files", NULL)
  158.   NOREQ_PARAM ("LASTFORMFEED",NULL, OPT_BOOLEAN, &last_form_feed, "no formfeed at the end of last page", NULL)
  159.   NOREQ_PARAM ("REVERSE",   "REV",  OPT_BOOLEAN, &Reverse,    "print in reverse order", NULL)
  160.   NOREQ_PARAM ("RESOLUTION","RES",  OPT_STRING,  &resolution_str, "bitmap resolution",
  161.         "(e.g. RES 100 or RES 180/360)")
  162.   NOREQ_PARAM ("PRELOAD",   NULL,   OPT_BOOLEAN, &PreLoad,    "preload all fonts", NULL)
  163.   NOREQ_PARAM ("FAST",      NULL,   OPT_BOOLEAN, &turbo_mode,    "fast-mode",
  164.         "(needs under 1.3 the 'puffer.device')")
  165.   NOREQ_PARAM ("STATISTIC", "STAT", OPT_BOOLEAN, &Stats,    "more output to the logfile", NULL)
  166.   NOREQ_PARAM ("DEBUGSTAT", NULL,   OPT_BOOLEAN, &DebugStats,    "close logfile after every line", NULL)
  167.   NOREQ_PARAM ("LOGFILE",   "LOG",  OPT_BOOLEAN, &logging,    "create logfile (DVIprint.log)", NULL)
  168.   NOREQ_PARAM ("OUTPUT",    "OUT",  OPT_STRING,  &output_file_name, "output to file, not to printer", NULL)
  169.   HIDDEN_PARAM("PRINTAUTHOR", NULL, OPT_BOOLEAN, &g_authors,    "show author name", NULL)
  170.   REQ_PARAM   (NULL,        NULL,   OPT_OPTIONSTRING, &filenameptr,"DVI-file", NULL)
  171. END_PARAM
  172.  
  173.  
  174. void DecodeArgs(int argc, char *argv[])
  175. {
  176.   BOOL error;
  177.   char *ext;    /* extension */
  178.   char prt[20], res[10];
  179.  
  180.   if (argc == 0) {
  181.     g_progname = _ProgramName;
  182.   }
  183.   else {
  184.     g_progname = argv[0];
  185.   }
  186.  
  187.   
  188.   switch (draft) {
  189.     case HIGH_Q:
  190.       onlydraft = FALSE;
  191.       onlycheap = FALSE;
  192.       break;
  193.     case DRAFT:
  194.       onlydraft = TRUE;
  195.       onlycheap = FALSE;
  196.       break;
  197.     case HIGH_Q_CHEAP:
  198.       onlydraft = FALSE;
  199.       onlycheap = TRUE;
  200.       break;
  201.     case DRAFT_CHEAP:
  202.       onlydraft = TRUE;
  203.       onlycheap = TRUE;
  204.       break;
  205.   }
  206.   optimize = TRUE;
  207.   sprintf(res, "%3d", resolution);
  208.   resolution_str = res;
  209.   strcpy(prt,"generic");
  210.   printer_str = prt;
  211.  
  212.   /*----------------------------------------------------------------*/
  213.   error = GetOpt(argc, argv, "DVIprint", TRUE, opt);
  214.   /*----------------------------------------------------------------*/
  215.  
  216.   if (error) {
  217.     PrintHelp(opt, FALSE);
  218.     AbortRun(5);    /* Programm Ende */
  219.   }
  220.  
  221.   if (help) {
  222.     PrintHelp(opt, TRUE);
  223.     AbortRun(0);
  224.   }
  225.  
  226.   if (maxbitmapsize != 0 && maxbitmapsize < MINBITMAPSIZE) {
  227.     printf("*** not a valid value, minimum is %ld or 0 for unlimited size.\n",MINBITMAPSIZE);
  228.   }
  229.  
  230.   if (odd && even) {
  231.     printf("*** decide you! only 'odd' or 'even'!\n");
  232.   }
  233.   if (odd) {
  234.     print_page_numbers = 1;
  235.   }
  236.   if (even) {
  237.     print_page_numbers = 2;
  238.   }
  239.  
  240.   check_printer_type(printer_str);
  241.  
  242.   if (density < 1 || density > 7) {
  243.     Message("*** Density must be out of the range [1..7]!");
  244.     AbortRun(5);
  245.   }
  246.  
  247.   if (landscape || iffprint) {
  248.     full_page_in_ram = TRUE;
  249.   }
  250.  
  251.   if (Reverse) {
  252.     PreLoad = TRUE;
  253.   }
  254.  
  255.   if (strchr(resolution_str,'/') != NULL) {
  256.     if (sscanf(resolution_str, "%d/%d", &hconvresolution, &vconvresolution) != 2 ) {
  257.       sprintf(m_string, "*** wrong resolution format '%s'! Use 'RES nr' or 'RES hnr/vnr'.", resolution_str);
  258.       Message(m_string);
  259.       AbortRun(5);
  260.     }
  261.     /* resolution = bleibt 0 um xx/yy von dd unterscheiden zu koennen! */
  262.   }
  263.   else {
  264.     if (sscanf(resolution_str, "%d", &resolution) != 1 ) {
  265.       sprintf(m_string, "*** wrong resolution format '%s'! Use 'RES nr' or 'RES hnr/vnr'.", resolution_str);
  266.       Message(m_string);
  267.       AbortRun(5);
  268.     }
  269.     hconvresolution = vconvresolution = resolution;
  270.   }
  271.  
  272.   if (DebugStats) {
  273.     Stats = 2;
  274.   }
  275.   if (!logging) {
  276.     g_logging = -1;
  277.   }
  278.   if (output_file_name != NULL) {
  279.     output_to_file = TRUE;
  280.   }
  281.  
  282.  
  283.   if (filenameptr != NULL) {
  284.     strcpy(filename, filenameptr);
  285.   }
  286.   else {
  287.     Fatal(5,"filenameptr == NULL ???",22);
  288.   }
  289.  
  290.   if ((ext = strrchr(filename, '.')) == NULL) {
  291.     strcat(filename, ".dvi");
  292.   }
  293.   else {
  294.     ext++;
  295.     if (stricmp(ext, "tex") == NULL) {
  296.       strcpy(ext, "dvi");    /* Ueberschreibe das '.tex' */
  297.     }
  298.     else {
  299.       if (stricmp(ext, "dvi") != NULL) {
  300.         strcat(filename, ".dvi");
  301.       }
  302.     }
  303.   }
  304.   dvifp = fopen(filename, "r");
  305.   if (dvifp == NULL) {
  306.     sprintf(m_string, "*** don't find DVI-file '%s'!", filename);
  307.     Message(m_string);
  308.     AbortRun(5);
  309.   }
  310.  
  311.   
  312.   /* Test ob ein paar unzulaessigen Sachen dabei sind */
  313.   
  314.   if (onlydraft && onlycheap) {
  315.     draft = DRAFT_CHEAP;
  316.   }
  317.   else if (!onlydraft && onlycheap) {
  318.     draft = HIGH_Q_CHEAP;
  319.   }
  320.   else if (onlydraft && !onlycheap) {
  321.     draft = DRAFT;
  322.   }
  323.   else {
  324.     draft = HIGH_Q;
  325.   }
  326.  
  327.   open_logfile();
  328. }
  329.  
  330.  
  331.  
  332. static void open_logfile(void)
  333. {
  334.   strcpy(g_Logname, DVIPRINT_LOGFILE);
  335.  
  336.   if (g_logging==1) {
  337.     if ((g_logfp = fopen(g_Logname,"w")) == NULL) {
  338.       fprintf(stderr,"\n");
  339.       fprintf(stderr,"%s: can't open LOG-file \"%s\"\n\n", g_progname, g_Logname);
  340.       AbortRun(5);
  341.     }
  342.   }
  343. }
  344.  
  345.  
  346. static void check_printer_type(char *str)
  347. {
  348.   printf("Printer Name: \"%s\"\n", str);
  349. }
  350.  
  351.  
  352. static void PrintHelp(struct Options opt[], short long_hlp)
  353. {
  354.   char hlp[100];
  355.  
  356.   /* Message(NULL); */
  357.   sprintf(m_string,"(c)Copyright 1990-91, (hes). All rights reserved. %s",__DATE__);
  358.   Message(m_string);
  359.  
  360.   sprintf(hlp, "usage: %s ", g_progname);
  361.   GetOptShortHelp(hlp, 73, opt);
  362.   
  363.   if (long_hlp) {
  364.     Message("");
  365.     GetOptHelp(opt);  
  366.   }
  367.   
  368. }
  369.  
  370.  
  371.  
  372. void main(int argc, char *argv[])
  373. {
  374.   DecodeArgs(argc, argv);
  375.   
  376.   printf("help:         '%d'\n", help);
  377.   printf("PXLpath:      '%s'\n", PXLpath);
  378.   printf("fontmemsize:  '%d'\n", fontmemsize);
  379.   printf("FirstPage:    '%d'\n", FirstPage);
  380.   printf("hoffset_in:   '%f'\n", hoffset_in);
  381.   printf("voffset_in:   '%f'\n", voffset_in);
  382.   printf("PreLoad:      '%d'\n", PreLoad);
  383.   printf("resolution:   '%d'\n", resolution);
  384.   printf("Stats:        '%d'\n", Stats);
  385.   printf("DebugStats:   '%d'\n", DebugStats);
  386.   printf("logging:      '%d'\n", logging);
  387.   printf("g_authors:    '%d'\n", g_authors);
  388.   printf("Filename:     '%s'\n", filename);
  389.  
  390.   if (argc == 0) {
  391.     Delay(200);
  392.   }
  393.   printf(".\n");
  394. }
  395.