home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Spezial / SPEZIAL2_97.zip / SPEZIAL2_97.iso / ANWEND / TOOLS / MPAGE / MPAGE.ZIP / mp_file.c < prev    next >
Text File  |  1997-09-25  |  6KB  |  232 lines

  1. # include <stdio.h>
  2. # include <sys/types.h>
  3.  
  4. # ifndef lint
  5. static char *rcs_id =
  6.     "@(#) $Header: mp_file.c,v 2.4 89/05/25 08:58:18 mark Exp $";
  7. # endif
  8.  
  9. # include "mp_head.h"
  10.  
  11. /*
  12.  * mpage:    a program to reduce pages of print so that several pages
  13.  *           of output appear on one printed page.
  14.  *
  15.  * Written by:
  16.  *   ...!uunet!\                       Mark Hahn, Sr Systems Engineer
  17.  *              >pyrdc!mark            Pyramid Technology Corporation
  18.  * ...!pyramid!/                       Vienna, Va    (703)848-2050
  19.  *
  20.  *
  21.  * Copyright (c) 1988 Mark P. Hahn, Herndon, Virginia
  22.  *  
  23.  *     Permission is granted to anyone to make or distribute verbatim
  24.  *     copies of this document as received, in any medium, provided
  25.  *     that this copyright notice notice is preserved, and that the
  26.  *     distributor grants the recipient permission for further
  27.  *     redistribution as permitted by this notice.
  28.  *
  29.  */
  30.  
  31. /* $Log:    mp_file.c,v $
  32.  * Revision 2.4  89/05/25  08:58:18  mark
  33.  * rearranged the rcs header keywords for better readability.
  34.  * 
  35.  * Revision 2.3  89/05/22  14:40:59  mark
  36.  * Fixed the type-o in the rcs identification string
  37.  * 
  38.  * Revision 2.2  89/05/22  14:38:02  mark
  39.  * Added rcs identification usable with the "what" program
  40.  * 
  41.  * Revision 2.1  89/05/22  14:31:24  mark
  42.  * New Major Revision
  43.  * 
  44.  * Revision 1.1  89/05/22  14:23:34  mark
  45.  * Initial revision
  46.  *  */
  47.  
  48. /*
  49.  * do_file converts one file into postscript for output.  The file type is
  50.  * determined then the proper conversion routine is selected.
  51.  */
  52. do_file(fname, asheet, outfd)
  53.  char *fname;
  54.  struct sheet *asheet;
  55.  FILE *outfd;
  56. {
  57.     FILE *fd;
  58.     int firstchr;
  59.  
  60.     /*
  61.      * if we have the pr option, then we have to assume it's a text file
  62.      */
  63.     if (opt_pr) {
  64.         do_pr_file(fname, asheet, outfd);
  65.         return;
  66.     }
  67.     /*
  68.      * if not using pr(1), open fname and try to figure out what type of
  69.      * file it is
  70.      */
  71.     if ((fd = fopen(fname, "r")) == NULL) {
  72.         fprintf(stderr, "%s: cannot open %s\n",
  73.             MPAGE, fname);
  74.         perror(MPAGE);
  75.         return;
  76.     }
  77.     /*
  78.      * check for the cutomary characters that flag a postscript file
  79.      */
  80.     if (ps_check(fd)) {
  81.         /*
  82.          * found the flag signaling PS input
  83.          */
  84.         do_ps_doc(fd, asheet, outfd);
  85.     } else {
  86.         /*
  87.          * no postscript flag, print the ascii text
  88.          */
  89.         do_text_doc(fd, asheet, outfd);
  90.     }
  91.     (void)fclose(fd);
  92. }
  93.  
  94. /*
  95.  * do_file processes one text file into postscript, but first runs the file
  96.  * through pr(1).
  97.  */
  98. do_pr_file(fname, asheet, outfd)
  99.  char *fname;
  100.  struct sheet *asheet;
  101.  FILE *outfd;
  102. {
  103.     FILE *fd;
  104.     char command[LINESIZE];
  105.  
  106.     /*
  107.      * build the proper command based upon a specified
  108.      * header or not
  109.      */
  110.     if (opt_doheader) {
  111.         (void)sprintf(command, "pr -l%d -w%d -h \"%s\" %s",
  112.                   asheet->sh_plength, asheet->sh_cwidth,
  113.                   opt_header, fname);
  114.     } else {
  115.         (void)sprintf(command, "pr -l%d -w%d %s",
  116.                   asheet->sh_plength, asheet->sh_cwidth,
  117.                   fname);
  118.     }
  119.     /*
  120.      * open a pipe to the proper pr(1) command, and pr provides
  121.      * us with the input
  122.      */
  123.     if ((fd = popen(command, "r")) == NULL) {
  124.         fprintf(stderr, "%s: cannot create pipe for '%s'\n",
  125.             command);
  126.         perror(MPAGE);
  127.     } else {
  128.         do_text_doc(fd, asheet, outfd);
  129.         (void)pclose(fd);
  130.     }
  131. }
  132.  
  133. /*
  134.  * do_stdin uses do_????_doc to process the standard input
  135.  */
  136. do_stdin(asheet, outfd)
  137.  struct sheet *asheet;
  138.  FILE *outfd;
  139. {
  140.     FILE *fd;
  141.     char command[LINESIZE];
  142.     char tmpfile[LINESIZE];
  143.     char buffer[LINESIZE];
  144.     int incnt, outcnt;
  145.  
  146.     if (opt_pr) {
  147.         Debug(DB_STDIN, "%%do_stdin: pr option selects text\n", 0);
  148.         /*
  149.          * if pr(1) is to be used we need to read the input
  150.          * and pass it to a pr(1) command which will write
  151.          * a temporary file; this temporary file will then
  152.          * be used as input to the do_doc routine
  153.          */
  154.         (void)strcpy(tmpfile, "/usr/tmp/mpageXXXXXX");
  155.         (void)mktemp(tmpfile);
  156.         if (opt_doheader) {
  157.             (void)sprintf(command, "pr -l%d -w%d -h \"%s\"> %s",
  158.                       asheet->sh_plength, asheet->sh_cwidth,
  159.                       opt_header, tmpfile);
  160.         } else {
  161.             (void)sprintf(command, "pr -l%d -w%d > %s",
  162.                       asheet->sh_plength, asheet->sh_cwidth,
  163.                       tmpfile);
  164.         }
  165.         /*
  166.          * open a pipe to the pr(1) command which will create a
  167.          * temporary file for convertin into PS
  168.          */
  169.         if ((fd = popen(command, "w")) == NULL) {
  170.             fprintf(stderr, "%s: cannot create pipe for '%s'\n",
  171.                 command);
  172.             perror(MPAGE);
  173.             return;
  174.         }
  175. #ifdef DEBUG
  176.         errno = 0;
  177.         Debug(DB_STDIN, "%% sizeof buffer == %d\n", sizeof buffer);
  178. #endif
  179.         /*
  180.          * read input to mpage and pass it onto the pr(1) command
  181.          */
  182.         do {
  183.             incnt = fread(buffer, 1, sizeof buffer, stdin);
  184.             outcnt = fwrite(buffer, 1, incnt, fd);
  185.             Debug(DB_STDIN, "%% incnt == %d,", incnt);
  186.             Debug(DB_STDIN, " outcnt == %d,", outcnt);
  187.             Debug(DB_STDIN, " errno == %d\n", errno);
  188.         } while (incnt && outcnt);
  189.         Debug(DB_STDIN, "%% Done with while\n", 0);
  190.         (void)pclose(fd);
  191.         Debug(DB_STDIN, "%% closed pipe, looking for tmpfile\n", 0);
  192.         /*
  193.          * now open the temporary file and use do_doc to
  194.          * convert it to PS
  195.          */
  196.         if ((fd = fopen(tmpfile, "r")) == NULL) {
  197.             fprintf(stderr, "%s: cannot open %s\n",
  198.                 MPAGE, tmpfile);
  199.             perror(MPAGE);
  200.         } else {
  201.             Debug(DB_STDIN, "%% got tmpfile, now do_doc\n", 0);
  202.             do_text_doc(fd, asheet, outfd);
  203.             (void)fclose(fd);
  204.         }
  205.         /*
  206.          * tidy up by removing our temp file
  207.          */
  208.         Debug(DB_STDIN, "%% now remove '%s'\n", tmpfile);
  209.         (void)unlink(tmpfile);
  210.     } else {
  211.         /*
  212.          * check for the cutomary flag at the start of postscript files
  213.          */
  214.         if (ps_check(stdin)) {
  215.             /*
  216.              * found the flag signaling PS input
  217.              */
  218.             Debug(DB_STDIN, "%%do_stdin: is postscript\n", 0);
  219.             do_ps_doc(stdin, asheet, outfd);
  220.         } else {
  221.             /*
  222.              * no postscript flag, print the ascii text
  223.              */
  224.             Debug(DB_STDIN, "%%do_stdin: not postscript\n", 0);
  225.             do_text_doc(stdin, asheet, outfd);
  226.         }
  227.     }
  228. }
  229.  
  230.  
  231.  
  232.