home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume6 / mp < prev    next >
Internet Message Format  |  1991-03-28  |  25KB

  1. From: richb@sunchat.sun.oz.AU (Rich Burridge)
  2. Newsgroups: comp.sources.misc
  3. Subject: v06i119: mp, a PostScript pretty printer
  4. Message-ID: <1822@basser.oz>
  5. Date: 7 Mar 89 22:12:11 GMT
  6.  
  7. Posting-number: Volume 6, Issue 119
  8. Submitted-By: Rich Burridge <richb@sunchat.sun.oz.AU>
  9. Archive-name: mp
  10.  
  11.  
  12. The mp program will pretty print various files for you. It can be used
  13. in conjunction with a mail reading utility for producing a pretty print
  14. of your mail items. It can be used with a news reading tool to pretty
  15. print news articles. Digests can also be printed, and this version can
  16. pretty print ordinary ASCII files as well.
  17.  
  18. See the README and the manual page for further details. Note that the
  19. code is already at patchlevel 1.
  20.  
  21.     Rich.
  22.  
  23. ------CUT HERE------CUT HERE------
  24. #! /bin/sh
  25. # this is a shell archive, meaning:
  26. # 1. Remove everything above the #! /bin/sh line
  27. # 2. Save the resulting text in a file.
  28. # 3. Execute the file with /bin/sh to create the files:
  29. #    README
  30. #    Makefile
  31. #    mailp
  32. #    mp.pro.ps
  33. #    mp.1
  34. #    mp.c
  35. # This archive created: Sat Mar  4 09:50:38 EST 1989
  36. #
  37. #
  38. export PATH; PATH=/bin:$PATH
  39. #
  40. if [ -f README ]
  41. then
  42. echo shar: will not over-write existing file README
  43. else
  44. echo shar: extracting 'README',     1968 characters
  45. cat > README <<'Funky_Stuff'
  46.  
  47. README for mp, the PostScript pretty printer.
  48.  
  49. Version 2.0 December 1988.
  50.  
  51. Permission is given to distribute these sources, as long as the
  52. authorship messages are not removed, and no monies are exchanged.
  53.  
  54. The mp program will pretty print various files for you. It can be used
  55. in conjunction with a mail reading utility for producing a pretty print
  56. of your mail items. It can be used with a news reading tool to pretty
  57. print news articles. Digests can also be printed, and this version can
  58. pretty print ordinary ASCII files as well.
  59.  
  60. It uses a PostScript prologue file which normally resides in
  61. /usr/local/lib, but this can be overwritten by use of the -p option.
  62.  
  63. See the manual pages for more details on these various options.
  64.  
  65. Do a "make" followed by a "make install" which will compile the mp program
  66. and put the files in their default locations. You will probably have to
  67. be super-user when you do the "make install"
  68.  
  69. Acknowledgements.
  70.  
  71. The original version of mp was written by Steve Holden in the ICON language,
  72. when Steve worked for Sun Microsystems UK. I converted it to the C language
  73. and added a few features. Bruno Pillard of Chorus Systemes, France added
  74. support for MH mail and news article printing, plus a shell script (mailp)
  75. which tidies up the user interface to mp. Dave Glowacki of Public Works
  76. Computer Services, St Paul, MN. added the ability to print digests and
  77. tidied up some of the other options. Rick Rodgers, UCSF School of Pharmacy,
  78. San Francicso revised the initial version of the mp manual page.
  79.  
  80. Thanks go also to Bill Shannon, Roger De Salis, L. Jill Debord and David
  81. Fiedler for bug reports and/or bug fixes. I'm grateful to all these people,
  82. plus everybody who has suggested enhancements, and fixed bugs in the previous
  83. versions.
  84.  
  85. I welcome further bug reports and suggestions for improvements.
  86.  
  87.     Rich.
  88.  
  89. Rich Burridge,          DOMAIN: richb@sunaus.oz.au
  90. PHONE: +61 2 413 2666   UUCP:   {uunet,mcvax,ukc}!munnari!sunaus.oz!richb
  91. Funky_Stuff
  92. len=`wc -c < README`
  93. if [ $len !=     1968 ] ; then
  94. echo error: README was $len bytes long, should have been     1968
  95. fi
  96. fi # end of overwriting check
  97. if [ -f Makefile ]
  98. then
  99. echo shar: will not over-write existing file Makefile
  100. else
  101. echo shar: extracting 'Makefile',     2071 characters
  102. cat > Makefile <<'Funky_Stuff'
  103. #
  104. #  Makefile for mp, the PostScript pretty printer.
  105. #
  106. #  @(#)Makefile 1.2 88/12/28
  107. #
  108. #  Original written in the Icon language by Steve Holden.
  109. #
  110. #  Converted to C, modified and maintained
  111. #  by Rich Burridge - Sun Microsystems Australia.
  112. #
  113. #  Further modifications to handle news articles and MH mail,
  114. #  by Bruno Pillard  - Chorus Systemes, St Quentin en Yvelines, France
  115. #
  116. #  Addition of digest printing by Dave Glowacki of Public
  117. #  Works Computer Services, St Paul, MN.
  118. #
  119. #  Ordinary text file pretty printing by Rich Burridge.
  120. #
  121. #  Copyright (c) Steve Holden and Rich Burridge.
  122. #                All rights reserved.
  123. #
  124. #  Permission is given to distribute these sources, as long as the
  125. #  copyright messages are not removed, and no monies are exchanged.
  126. #
  127. #  No responsibility is taken for any errors inherent either
  128. #  to the comments or the code of this program, but if reported
  129. #  to me then an attempt will be made to fix them.
  130. #
  131. #------------------------------------------------------------------
  132. #  It is possible to change the location of the mp prologue file
  133. #  with the -p command line option. It can also be defined at compile
  134. #  time. If it's not present, then a sensible default value is used.
  135. #
  136. #
  137. #  Prologue file used with mp.
  138. #
  139. PROLOGUE = -DPROLOGUE=\"$(LIBDIR)/mp.pro.ps\"
  140. #---------------------------------------------------------------------
  141.  
  142. BINARIES = mp
  143. BINDIR   = /usr/local/bin
  144. LIBDIR   = /usr/local/lib
  145. MANDIR   = /usr/man/man$(MANSECT)
  146. MANSECT  = l
  147. CFLAGS   = -g $(PROLOGUE)
  148. OBJS     = mp.o
  149. SRCS     = mp.c
  150. OTHERS   = README Makefile mailp mp.pro.ps mp.1
  151.  
  152. all:       $(BINARIES)
  153.  
  154. mp:        $(OBJS)
  155.        cc $(CFLAGS) -o mp $(OBJS)
  156.  
  157. install:   $(BINARIES)
  158.        install -s -m 751 mp $(BINDIR)
  159.        install -c -m 644 mp.1 $(MANDIR)/mp.$(MANSECT)
  160.        install -c -m 644 mp.pro.ps $(LIBDIR)
  161.  
  162. backup:;   cp $(SRCS) $(OTHERS) backdir
  163.  
  164. clean:;    rm -rf mp *.o core
  165.  
  166. create:    SCCS
  167.        -sccs create $(SRCS) $(OTHERS)
  168.  
  169. lint:;     lint $(SRCS)
  170.  
  171. shar:;     shar.script $(OTHERS) $(SRCS) > archive
  172.  
  173. SCCS:
  174.        mkdir SCCS
  175.        chmod 755 SCCS
  176.  
  177. mp.o:      mp.c
  178. Funky_Stuff
  179. len=`wc -c < Makefile`
  180. if [ $len !=     2071 ] ; then
  181. echo error: Makefile was $len bytes long, should have been     2071
  182. fi
  183. fi # end of overwriting check
  184. if [ -f mailp ]
  185. then
  186. echo shar: will not over-write existing file mailp
  187. else
  188. echo shar: extracting 'mailp',      523 characters
  189. cat > mailp <<'Funky_Stuff'
  190. #! /bin/sh
  191. #
  192. #  @(#)mailp 1.2 88/12/28
  193. #
  194. #  mailp, newsp, filep, mhp and digestp
  195. #  shell script de lancement de mp (mail/news/file pretty printer)
  196. #
  197. #  Bruno Pillard - October 1988.
  198.  
  199. BIN=/usr/local/bin
  200.  
  201. case $0 in
  202.     *mailp)   PROG=mp       ;; 
  203.     *mhp)       PROG="mp -mh" ;;
  204.     *newsp)      PROG="mp -n"  ;;
  205.     *digestp) PROG="mp -d"    ;;
  206.     *filep)      PROG="mp -o"  ;;
  207.     *)    echo Unknown pretty printer: $0
  208.         exit;;
  209. esac
  210.  
  211. if    [ $# -eq 0 ]
  212. then
  213.     set - " - "
  214. fi
  215. while [ $# -gt 0 ]
  216. do
  217.     /bin/cat $1 | ${BIN}/${PROG} | lpr -h -Plw
  218.     shift
  219. done
  220. Funky_Stuff
  221. len=`wc -c < mailp`
  222. if [ $len !=      523 ] ; then
  223. echo error: mailp was $len bytes long, should have been      523
  224. fi
  225. fi # end of overwriting check
  226. if [ -f mp.pro.ps ]
  227. then
  228. echo shar: will not over-write existing file mp.pro.ps
  229. else
  230. echo shar: extracting 'mp.pro.ps',     1764 characters
  231. cat > mp.pro.ps <<'Funky_Stuff'
  232. %!PS-Adobe-1.0
  233. %%Creator: Steve Holden
  234. %%Modifed: Rich Burridge
  235. %%Title: @(#)mp.pro.ps 1.2 88/12/28
  236. %%CreationDate: see above
  237. %%DocumentFonts: Times-Bold Times-Roman Courier
  238. %%Pages: (atend)
  239. %%EndComments
  240.  
  241. /font1d /Times-Bold findfont 10 scalefont def
  242. /font2d /Times-Roman findfont 10 scalefont def
  243. /font3d /Courier findfont 9 scalefont def
  244. /fontHd /Helvetica-BoldOblique findfont 15 scalefont def
  245. /fontH2 /Helvetica-BoldOblique findfont 10 scalefont def
  246. /fontNd /Times-Bold findfont 12 scalefont def
  247.  
  248. /BoldFont { font1d setfont } def
  249. /PrimaryFont { font2d setfont } def
  250. /SecondaryFont { font3d setfont } def
  251. /fontH { fontHd setfont } def
  252. /fontD { fontH2 setfont } def
  253. /fontN { fontNd setfont } def
  254.  
  255. SecondaryFont
  256.  
  257. /endpage
  258. {
  259.   gsave
  260.     fontH
  261.     newpath
  262.       90 756 moveto
  263.       100 736 10 180 270 arc
  264.       536 736 10 270 0 arc
  265.       536 756 10 0 90 arc
  266.       100 756 10 90 180 arc
  267.     closepath
  268.     0.75 setgray fill
  269.     newpath
  270.       318 746 15 0 360 arc
  271.       gsave
  272.         1 setgray fill
  273.       grestore
  274.     closepath
  275.     0 setgray stroke
  276.     100 740 moveto
  277.     MailFor show
  278.     User show
  279.     fontD
  280.     TimeNow stringwidth pop neg 536 add 740 moveto TimeNow show
  281.     fontN
  282.     dup stringwidth pop 2 div neg 318 add 740 moveto show
  283.     fontH
  284.     newpath
  285.       90 60 moveto
  286.       100 40 10 180 270 arc
  287.       536 40 10 270 0 arc
  288.       536 60 10 0 90 arc
  289.       100 60 10 90 180 arc
  290.     closepath
  291.     0.75 setgray fill
  292.     0 setgray
  293.     100 44 moveto Subject show
  294.   grestore
  295.   showpage              % display it
  296.   newpage               % reset parameters for next
  297. } def
  298.  
  299. /newpage
  300. {
  301.   /lct 0 def
  302.   /ypos 700 def
  303.   100 ypos moveto
  304. } def
  305.  
  306. /showline
  307. {
  308.   show
  309.   /ypos ypos 10 sub def
  310.   100 ypos moveto
  311. } def
  312.  
  313. newpage                    % establish first page parameters
  314. Funky_Stuff
  315. len=`wc -c < mp.pro.ps`
  316. if [ $len !=     1764 ] ; then
  317. echo error: mp.pro.ps was $len bytes long, should have been     1764
  318. fi
  319. fi # end of overwriting check
  320. if [ -f mp.1 ]
  321. then
  322. echo shar: will not over-write existing file mp.1
  323. else
  324. echo shar: extracting 'mp.1',     2751 characters
  325. cat > mp.1 <<'Funky_Stuff'
  326. .\" @(#)mp.1 1.2 88/12/28
  327. .TH MP 1L "28 December 1988"
  328. .SH NAME
  329. mp \- Postscript pretty printer
  330. .SH SYNOPSIS
  331. .B mp
  332. [
  333. .B \-d
  334. ]
  335. [
  336. .B \-mh
  337. ]
  338. [
  339. .B \-n
  340. ]
  341. [
  342. .B \-o
  343. ]
  344. [
  345. .B \-p
  346. .I prologue
  347. ]
  348. [
  349. .B \-s
  350. .I subject
  351. ]
  352. [
  353. .B \-v
  354. ]
  355. [
  356. .B \-?
  357. ]
  358. .SH DESCRIPTION
  359. .B mp
  360. will take a mail item, a news article or an ordinary ASCII file on
  361. standard input and generate a Postscript file on standard output,
  362. which is a pretty print of the original. It is also possible to print
  363. out complete mail folders and digests.
  364. .LP
  365. The format adopted has shaded stripes containing banner information
  366. at the top and bottom of every page. It is also possible to supply a
  367. complete mail folder to be printed.
  368. .LP
  369. .B mp
  370. was originally designed to be used in conjunction with the print
  371. button in the
  372. .B "mailtool (1)"
  373. program, or the
  374. .B pipe
  375. command from within mail. Add (or alter) the following two line in your
  376. .B .mailrc
  377. file:
  378. .in +1.0i
  379. .nf
  380. \fCset printmail='mp | lpr'
  381. set cmd="mp | lpr &"\fP
  382. .fi
  383. .in -1.0i
  384. .LP
  385. Source the
  386. .B .mailrc
  387. file again, and you are ready.
  388. .LP
  389. A useful alias to use used in conjunction with your
  390. .I .cshrc
  391. file for printing out ordinary text files is:
  392. .in +1.0i
  393. .nf
  394. \fCalias print 'mp -o -s "\\!*" <\\!* | lpr'\fP
  395. .fi
  396. .in -1.0i
  397. .SH OPTIONS
  398. .TP
  399. .B \-d
  400. The file on standard input is a digest so print accordingly.
  401. .TP
  402. .B \-mh
  403. Use if the mail article on standard input comes from the
  404. .B "MH Mail (1L)"
  405. package, because the
  406. .I From
  407. mail header lines are of a slightly different format.
  408. .TP
  409. .B \-n
  410. The file on standard input is a news article so print accordingly.
  411. .TP
  412. .B \-o
  413. The file on standard input is an ASCII file so print accordingly.
  414. .TP
  415. .BI \-p " prologue filename"
  416. Employ
  417. .I "prologue filename"
  418. as the Postscript prologue file. The default location is
  419. .I /usr/local/lib/mp.pro.ps
  420. .TP
  421. .BI \-s " subject"
  422. Use
  423. .I " subject"
  424. as the new subject for the printout.
  425. .TP
  426. .B \-v
  427. Print the version number of this release of the
  428. .B mp
  429. program.
  430. .TP
  431. .B \-?
  432. Print the usage line for this program. Note that the
  433. .B ?
  434. character should be escaped if running from
  435. .BR csh (1).
  436. .SH FILES
  437. .TP
  438. .B /usr/local/bin/mp
  439. executable
  440. .TP
  441. .B /usr/local/lib/mp.pro.ps
  442. PostScript prologue to define required vocabulary for mail printing.
  443. Editing this file will allow you to introduce some stylistic variation
  444. in the printing of mail.
  445. .SH "SEE ALSO"
  446. mail(1)
  447. .SH AUTHORS
  448. Original version by Steve Holden.
  449. .br
  450. Converted to C, modified and maintained by Rich Burridge, Sun Microsystems Australia,
  451. .br
  452. Modified to handle net news articles and MH mail by Bruno Pillard, Chorus Systemes, France,
  453. .br
  454. Handling of mail digests added by Dave Glowacki of Public Works Computer Services, St Paul, MN.
  455. .br
  456. Manual page for the initial version revised by Rick Rodgers, UCSF School of Pharmacy, San Francicso.
  457. Funky_Stuff
  458. len=`wc -c < mp.1`
  459. if [ $len !=     2751 ] ; then
  460. echo error: mp.1 was $len bytes long, should have been     2751
  461. fi
  462. fi # end of overwriting check
  463. if [ -f mp.c ]
  464. then
  465. echo shar: will not over-write existing file mp.c
  466. else
  467. echo shar: extracting 'mp.c',    12580 characters
  468. cat > mp.c <<'Funky_Stuff'
  469. #ifndef lint
  470. static char sccsid[] = "@(#)mp.c 1.4 89/01/03" ;
  471. #endif
  472.  
  473. /*  Takes a mail file, a news article or an ordinary file
  474.  *  and pretty prints it on a Postscript printer.
  475.  *
  476.  *  Original written in the Icon language by Steve Holden.
  477.  *
  478.  *  Converted to C, modified and maintained
  479.  *  by Rich Burridge - Sun Microsystems Australia.
  480.  *
  481.  *  Further modifications to handle news articles and MH mail,
  482.  *  by Bruno Pillard  - Chorus Systemes, St Quentin en Yvelines, France
  483.  *
  484.  *  Addition of digest printing by Dave Glowacki of Public
  485.  *  Works Computer Services, St Paul, MN.
  486.  *
  487.  *  Ordinary text file pretty printing by Rich Burridge.
  488.  *
  489.  *  Copyright (c) Steve Holden and Rich Burridge.
  490.  *                All rights reserved.
  491.  *
  492.  *  Permission is given to distribute these sources, as long as the
  493.  *  copyright messages are not removed, and no monies are exchanged.
  494.  *
  495.  *  No responsibility is taken for any errors inherent either
  496.  *  to the comments or the code of this program, but if reported
  497.  *  to me then an attempt will be made to fix them.
  498.  */
  499.  
  500. #include <stdio.h>
  501. #include <sys/types.h>
  502. #include <sys/file.h>
  503. #include <string.h>
  504. #include <time.h>
  505. #include <pwd.h>
  506.  
  507. #define  PATCHLEVEL   1
  508.  
  509. #define  FPRINTF      (void) fprintf    /* To make lint happy. */
  510. #define  PRINTF       (void) printf
  511. #define  SPRINTF      (void) sprintf
  512. #define  SSCANF       (void) sscanf
  513. #define  STRCPY       (void) strcpy
  514. #define  STRNCPY      (void) strncpy
  515.  
  516. enum print_type { PRINTMAIL, PRINTNEWS, PRINTORD } ;
  517.  
  518. /* States for the mail processing automation. */
  519. #define  FROMLINE     0      /* Searching for the initial From line. */
  520. #define  DOHEADER     1      /* Processing rest of message header. */
  521. #define  DOMESSAGE    2      /* Processing text in message body. */
  522. #define  DOTEXT       3      /* Ordinary file - just print it. */
  523.  
  524. #define  EQUAL(val)   !strncmp(val,nextline,strlen(val))
  525. #define  INC          argc-- ; argv++ ;
  526. #define  LINELENGTH   80     /* Number of characters per line. */
  527. #define  MAXLINE      256    /* Length of character strings. */
  528. #define  PAGELENGTH   60     /* Number of lines per page. */
  529.  
  530. time_t time() ;
  531. struct tm *localtime() ;
  532. char *asctime(), *getlogin(), *gets() ;
  533. char mf[MAXLINE] ;           /* "[Mail,News,Listing] for ". */
  534. char nextline[MAXLINE] ;     /* Next line of the mail message. */
  535. char progname[MAXLINE] ;     /* Name of this program. */
  536. char prologue[MAXLINE] ;     /* Name of PostScript prologue file. */
  537. char username[MAXLINE] ;     /* The username of the mail file owner. */
  538. char subject[MAXLINE] ;      /* Subject line for this message. */
  539. FILE *fopen(), *pf ;
  540.  
  541. enum print_type ptype ;     /* Type of printing to do. */
  542.  
  543. int digest = 0 ;            /* Set if we are printing a mail digest. */
  544. int lindex ;                /* Index pointer to nextline. */
  545. int linect = 0 ;            /* Line count on current page. */
  546. int maybe_more = 0 ;        /* Message header continuation line indicator. */
  547. int mhflag = 0 ;            /* Set if we are printing an MHmail message. */
  548. int non_space ;             /* Indicates if nextline has a non-space char. */
  549. int pn = 1 ;                /* Page number within message. */
  550. int rec_line = 0 ;          /* "Received:" line in message header. */
  551. int removednl ;             /* Set if a newline was removed from this line. */
  552. int state ;                 /* Current state of the print automation. */
  553. int tpn = 0 ;               /* Total number of pages printed. */
  554.  
  555.  
  556. /*ARGSUSED*/
  557. main(argc,argv)
  558. int argc ;
  559. char **argv ;
  560. {
  561.   long clock ;             /* Used by the localtime function call. */
  562.   struct tm *tm ;          /* Used by the localtime and asctime calls. */
  563.  
  564.   STRCPY(progname, argv[0]) ;  /* Save this program name. */
  565.   initialise() ;               /* Set default values for various options. */
  566.   get_options(argc,argv) ;     /* Read and process command line options. */
  567.  
  568.   if ((pf = fopen(prologue, "r")) == NULL)
  569.     {
  570.       FPRINTF(stderr,"%s: Prologue file not found.\n",progname) ;
  571.       exit(1) ;
  572.     } 
  573.   while (fgets(nextline,MAXLINE,pf) != NULL) PRINTF("%s",nextline) ;
  574.  
  575.   defwrite("MailFor", mf) ;    /* Output initial definitions. */
  576.   defwrite("User", username) ;
  577.   clock = time((time_t *) 0) ;
  578.   tm = localtime(&clock) ;
  579.   defwrite("TimeNow",asctime(tm)) ;
  580.   defwrite("Subject", subject) ;
  581.   PRINTF("%%%%EndProlog\n") ;
  582.  
  583.   if (ptype == PRINTORD) state = DOTEXT ;
  584.   else state = FROMLINE ;
  585.   startpage() ;
  586.   while (fgets(nextline,LINELENGTH+1,stdin) != NULL)
  587.     {
  588.       removednl = 0 ;
  589.       if (nextline[strlen(nextline)-1] == '\n')
  590.         {
  591.           removednl = 1 ;
  592.           nextline[strlen(nextline)-1] = '\0' ;
  593.         }
  594.       non_space = 0 ;
  595.       for (lindex = 0; lindex < strlen(nextline); lindex++)
  596.         if (nextline[lindex] != ' ')
  597.           {
  598.             non_space = 1 ;
  599.             break ;
  600.           }
  601.       process() ;
  602.     }
  603.   endpage() ;
  604.   PRINTF("%%%%Trailer\n") ;
  605.   PRINTF("%%%%Pages: %1d\n",tpn) ;
  606. }
  607.  
  608.  
  609. boldshow(s)
  610. char *s ;
  611. {
  612.   useline() ;
  613.   PRINTF("BoldFont ") ;
  614.   startline() ;
  615.   expand(s) ;
  616.   endline() ;
  617. }
  618.  
  619.  
  620. defwrite(name,def)
  621. char *name, *def ;
  622. {
  623.   PRINTF("/%s (%s) def\n",name,def) ;
  624. }
  625.  
  626.  
  627. endline()
  628. {
  629.   PRINTF(") showline\n") ;
  630. }
  631.  
  632.  
  633. endpage()
  634. {
  635.   linect = 0 ;
  636.   PRINTF("(%1d) endpage\n",pn++) ;
  637. }
  638.  
  639.  
  640. expand(s)
  641. char *s ;
  642. {
  643.   int i,j,n ;
  644.  
  645.   n = 0 ;
  646.   for (i = 0; i < strlen(s); i++)
  647.     {
  648.       switch (s[i])
  649.         {
  650.           case '\\'   : PRINTF("\\\\") ;
  651.                         n++ ;
  652.                         break ;
  653.           case '('    : PRINTF("\\(") ;
  654.                         n++ ;
  655.                         break ;
  656.           case ')'    : PRINTF("\\)") ;
  657.                         n++ ;
  658.                         break ;
  659.           case '\t'   : for (j = 0; j < (8 - (n % 8)); j++)
  660.                         PRINTF(" ") ;
  661.                         n = n + 8 - (n % 8) ;
  662.                         break ;
  663.           case '\004' : break ;
  664.           default     : PRINTF("%c",s[i]) ;
  665.                         n++ ;
  666.         }
  667.       if (!(i % LINELENGTH) && i)
  668.         {
  669.           endline() ;
  670.           startline() ;
  671.         }
  672.     }
  673. }
  674.  
  675.  
  676. get_options(argc,argv)      /* Read and process command line options. */
  677. int argc ;
  678. char *argv[] ;
  679. {
  680.   INC ;
  681.   while (argc > 0)
  682.     {
  683.       if (argv[0][0] == '-')
  684.         switch (argv[0][1])
  685.           {
  686.             case 'd' : digest = 1 ;                   /* Print mail digest. */
  687.                        break ;
  688.             case 'm' : if (argv[0][2] == 'h') mhflag = 1 ;  /* Handle MHmail. */
  689.                        break ;
  690.             case 'n' : ptype = PRINTNEWS ;            /* Print news article. */
  691.                        STRCPY(mf, "News for ") ;
  692.                        break ;
  693.             case 'o' : ptype = PRINTORD ;             /* Print ordinary file. */
  694.                        STRCPY(mf, "Listing for ") ;
  695.                        break ;
  696.             case 'p' : INC ;
  697.                        if (*argv != NULL && argv[0][0] != '-')
  698.                          STRCPY(prologue, *argv) ;    /* New prologue file. */
  699.                        else
  700.                          {
  701.                            FPRINTF(stderr,"%s: -p needs prologue name as next argument.\n",
  702.                                           progname) ;
  703.                            exit(1) ;
  704.                          }
  705.                        break ;
  706.             case 's' : INC ;
  707.                        if (*argv != NULL && argv[0][0] != '-')
  708.                          STRCPY(subject, *argv) ;     /* New subject line. */
  709.                        else
  710.                          {
  711.                            FPRINTF(stderr,"%s: -s needs subject name as next argument.\n",
  712.                                           progname) ;
  713.                            exit(1) ;
  714.                          }
  715.                        break ;
  716.             case 'v' : FPRINTF(stderr,"%s version 2.0.%1d\n",progname,PATCHLEVEL) ;
  717.                        exit(1) ;
  718.             case '?' : FPRINTF(stderr,"Usage: %s [-d] [-mh] [-n] [-o] [-p prologue] [-v] [-?]\n",
  719.                                       progname) ;
  720.                        exit(1) ;
  721.           }
  722.       argc-- ;
  723.       argv++ ;
  724.     }
  725. }
  726.  
  727.  
  728. initialise()           /* Set default values for various options. */
  729. {
  730.   char *ptr ;
  731.   struct passwd *pp ;
  732.  
  733. #ifdef PROLOGUE
  734.   STRCPY(prologue, PROLOGUE) ;     /* Location of the mp prologue file. */
  735. #else
  736.   STRCPY(prologue, "/usr/local/lib/mp.pro.ps") ;
  737. #endif
  738.  
  739.   STRCPY(mf,"Mail for ") ;         /* Assume mail as default. */
  740.   ptr = getlogin() ;               /* Pointer to users login name. */
  741.   if (ptr != NULL)
  742.     STRCPY(username, getlogin()) ; /* Users' login name. */
  743.   else                             /* Else get it from the passwd file. */
  744.     {
  745.       pp = getpwuid(geteuid()) ;
  746.       if (pp == NULL) STRCPY(username, "printing") ;
  747.       else STRCPY(username, pp -> pw_name) ;
  748.     }
  749.   ptype = PRINTMAIL ;              /* Pretty print mail item by default. */
  750. }
  751.  
  752.  
  753. mixedshow(s)
  754. char *s ;
  755. {
  756.   char first[MAXLINE] ;
  757.  
  758.   useline() ;
  759.   SSCANF(s,"%s",first) ;
  760.   PRINTF("BoldFont (%s) show PrimaryFont (",first) ;
  761.   expand(&s[strlen(first)]) ;
  762.   endline() ;
  763.   if (!strcmp("Subject:",first))
  764.     {
  765.       PRINTF("/Subject (") ;
  766.       expand(&s[strlen(first)]) ;
  767.       STRCPY(subject,&s[strlen(first)]) ;
  768.       PRINTF(") def\n") ;
  769.     }
  770. }
  771.  
  772.  
  773. process()
  774. {
  775.   switch (state)
  776.     {
  777.       case FROMLINE  : if (EQUAL(ptype == PRINTNEWS ?
  778.                                  "From:" : (mhflag ? "From" : "From ")))
  779.                          {
  780.                            boldshow(nextline) ;
  781.                            state = DOHEADER ;
  782.                          }
  783.                        break ;
  784.       case DOHEADER  : if (ptype == PRINTNEWS && EQUAL("Newsgroups"))
  785.                          {
  786.                            mixedshow(nextline) ;
  787.                            maybe_more = 0 ;
  788.                            rec_line = 0 ;
  789.                          }
  790.                        if (EQUAL(mhflag ? "From" : "From:") ||
  791.                            EQUAL("Date") || EQUAL("Subject"))
  792.                          {
  793.                            mixedshow(nextline) ;
  794.                            maybe_more = 0 ;
  795.                            rec_line = 0 ;
  796.                          }
  797.                        else if (EQUAL("To") || EQUAL("Cc"))
  798.                          {
  799.                            mixedshow(nextline) ;
  800.                            maybe_more = 1 ;
  801.                            rec_line = 0 ;
  802.                          }
  803.                        else if (EQUAL("Received:"))
  804.                          {
  805.                            maybe_more = 0 ;
  806.                            rec_line = 1 ;
  807.                          }
  808.                        else if (EQUAL(" ") && non_space && maybe_more)
  809.                          {
  810.                            rec_line = 0 ;
  811.                            textshow(nextline) ;
  812.                          }
  813.                        else if ((EQUAL(" ") && (!non_space)) || (!strlen(nextline) && !rec_line))
  814.                          {
  815.                            state = DOMESSAGE ;
  816.                            PRINTF("SecondaryFont\n") ;
  817.                            PRINTF("() showline\n") ;
  818.                          }
  819.                        else maybe_more = 0 ;
  820.                        break ;
  821.       case DOMESSAGE : if (digest && (EQUAL("Date: ") || EQUAL("From: ")))
  822.                          {
  823.                            linect = PAGELENGTH ;
  824.                            useline() ;
  825.                            mixedshow(nextline) ;
  826.                            state = DOHEADER ;
  827.                          }
  828.                        else if (EQUAL("From ") && (ptype == PRINTMAIL))
  829.                          {
  830.                            linect = PAGELENGTH ;
  831.                            useline() ;
  832.                            pn = 1 ;
  833.                            boldshow(nextline) ;
  834.                            state = DOHEADER ;
  835.                          }
  836.                        else textshow(nextline) ;
  837.                        break ;
  838.       case DOTEXT    : textshow(nextline) ;
  839.     }
  840. }
  841.  
  842.  
  843. startline()
  844. {
  845.   PRINTF("(") ;
  846. }
  847.  
  848.  
  849. startpage()
  850. {
  851.   PRINTF("%%%%Page: ? %1d\n",++tpn) ;
  852.   defwrite("MailFor", mf) ;
  853.   defwrite("User", username) ;
  854. }
  855.  
  856.  
  857. textshow(s)
  858. char *s ;
  859. {
  860.   if (*s == '\014')
  861.     {
  862.       if (removednl)        /* Is this the bogus formfeed at the end? */
  863.         {
  864.           linect = PAGELENGTH ;
  865.           useline() ;
  866.         }
  867.       return ;
  868.     }
  869.   useline() ;
  870.   startline() ;
  871.   expand(s) ;
  872.   endline() ;
  873. }
  874.  
  875.  
  876. useline()
  877. {
  878.   if (++linect > PAGELENGTH)
  879.     {
  880.       endpage() ;
  881.       startpage() ;
  882.       PRINTF("/Subject (") ;
  883.       expand(subject) ;
  884.       PRINTF(") def\n") ;
  885.     }
  886. }
  887. Funky_Stuff
  888. len=`wc -c < mp.c`
  889. if [ $len !=    12580 ] ; then
  890. echo error: mp.c was $len bytes long, should have been    12580
  891. fi
  892. fi # end of overwriting check
  893.  
  894.