david@infopro.UUCP (David Fiedler) (12/09/88)
I love the mp program! After feeding a few news articles through it, I
found it didn't handle news headers well, so came up with the following
fix which seems compatible with mail also:
---------------------------
125c
case DOHEADER : if (EQUAL("From") || EQUAL("Date") || EQUAL("Path") \
|| EQUAL("Subject"))
.
---------------------------
The change to make it sense a news article, and thus print "News for ____"
in the header (rather than "Mail for ____"), is left to those with more
free time than I have!
--
David Fiedler {ames,attmail,hoptoad,pyramid}!infopro!david
USMail: InfoPro Systems, PO Box 220, Rescue CA 95672 Phone: 916/677-5870
"I can't answer the door, my wife is taking a bath in the sink."
daveg@roxanne.StPaul.GOV (Dave Glowacki) (12/15/88)
Here's a patch to get mp to print news articles. This patch adds the following features: * Instead of "Mail for user" in the heading, it prints "Article from newsgroup". It guesses that it's processing a news article via the presence of either a "Newsgroups: " or an "Article " header field. * A "-d" option has been added, to handle digests (each separate article on a new page with its subject at the bottom.) * Identification of header fields has (hopefully) been tightened up. This was done by making sure appropriate header fields were followed by colon/space. This patch also assumes that mail "From " header fields are of the form "From user [Sun-Sat] ..." which will hopefully cut down on the number of falsely identified lines beginning with "From". If someone REALLY wanted to get carried away, it'd probably be nice to have a way to specify which header fields to print and which to leave out (being a rigid domainist, I left out the "Path:" field patch from Mr. Feidler, which motivated this whole thing :-) -- *** mp.c.orig Tue Dec 13 16:14:53 1988 --- mp.c Tue Dec 13 16:37:19 1988 *************** *** 12,17 **** --- 12,18 ---- #include <sys/file.h> #include <string.h> #include <time.h> + #include <ctype.h> #define PATCHLEVEL 2 *************** *** 35,40 **** --- 36,43 ---- time_t time() ; struct tm *localtime() ; char *asctime(), *getlogin(), *gets() ; + int newsarticle = 0; /* =1 if this is a news article */ + char titleobj[MAXLINE]; /* User name/Newsgroup name for this message */ char subject[MAXLINE] ; /* Subject line for this message. */ FILE *fopen(), *pf ; *************** *** 58,63 **** --- 61,67 ---- int state ; /* State of message processing automation. */ long clock ; /* Used by the localtime function call. */ struct tm *tm ; /* Used by the localtime and asctime calls. */ + int digest = 0; /* =1 if we're processing a digest */ char *progname = *argv ; /* This programs name. */ STRCPY(prologue, "/usr/local/lib/mp.pro.ps") ; /* Set up default values. */ *************** *** 77,82 **** --- 81,90 ---- exit(1) ; } } + else if (strcmp(*args, "-d") == 0) + { + digest = 1; + } else { FPRINTF(stderr,"%s: Unknown option %s\n",progname,*args) ; *************** *** 91,97 **** } while (fgets(nextline,MAXLINE,pf) != NULL) PRINTF("%s",nextline) ; ! defwrite("loginname",username) ; clock = time((time_t *) 0) ; tm = localtime(&clock) ; defwrite("timenow",asctime(tm)) ; --- 99,105 ---- } while (fgets(nextline,MAXLINE,pf) != NULL) PRINTF("%s",nextline) ; ! defwrite("titleobj",username) ; clock = time((time_t *) 0) ; tm = localtime(&clock) ; defwrite("timenow",asctime(tm)) ; *************** *** 116,133 **** } switch (state) { ! case FROMLINE : if (EQUAL("From")) { boldshow(nextline) ; state = DOHEADER ; } break ; ! case DOHEADER : if (EQUAL("From") || EQUAL("Date") || EQUAL("Subject")) { mixedshow(nextline) ; maybe_more = 0 ; } ! else if (EQUAL("To") || EQUAL("Cc")) { mixedshow(nextline) ; maybe_more = 1 ; --- 124,152 ---- } switch (state) { ! case FROMLINE : if (EQUAL("From ") && realfrom(nextline)) { boldshow(nextline) ; state = DOHEADER ; } + else if (EQUAL("From: ")) + { + mixedshow(nextline); + state = DOHEADER; + } + else if (EQUAL("Article ")) + { + boldshow(nextline); + getnewsgroup(nextline); + state = DOHEADER; + } break ; ! case DOHEADER : if (EQUAL("From: ") || EQUAL("Date: ") || EQUAL("Subject: ") || EQUAL("Message-ID: ") || EQUAL("References: ")) { mixedshow(nextline) ; maybe_more = 0 ; } ! else if (EQUAL("To: ") || EQUAL("Cc: ")) { mixedshow(nextline) ; maybe_more = 1 ; *************** *** 140,155 **** PRINTF("Courier\n") ; PRINTF("() showline\n") ; } else maybe_more = 0 ; break ; ! case DOMESSAGE : if (EQUAL("From")) { ! linect = PAGELENGTH ; useline() ; boldshow(nextline) ; state = DOHEADER ; } ! else textshow(nextline) ; break ; } } --- 159,195 ---- PRINTF("Courier\n") ; PRINTF("() showline\n") ; } + else if (EQUAL("Newsgroups: ")) + { + mixedshow(nextline) ; + if (!newsarticle) + getnewsgroup(nextline); + } else maybe_more = 0 ; break ; ! case DOMESSAGE : if (EQUAL("From ") && realfrom(nextline)) { ! linect = PAGELENGTH ; useline() ; boldshow(nextline) ; state = DOHEADER ; } ! else if (digest && (EQUAL("Date: ") || EQUAL("From: "))) ! { ! linect = PAGELENGTH ; ! useline() ; ! mixedshow(nextline) ; ! state = DOHEADER ; ! } ! else if (EQUAL("Article ")) ! { ! linect = PAGELENGTH ; ! useline() ; ! boldshow(nextline); ! getnewsgroup(nextline); ! state = DOHEADER; ! } ! else textshow(nextline) ; break ; } } *************** *** 159,164 **** --- 199,245 ---- } + getnewsgroup(s) + char *s; + { + char *n; + + for (n = &s[strlen(s) - 1]; (n != s) && !isspace(*n); n--) + ; + if (n == s) + *titleobj = '\0'; + else + for (n++, s = titleobj; *n && (*n != ':') && (*n != ','); ) + *s++ = *n++; + *s = '\0'; + PRINTF("/titleobj (") ; + expand(titleobj) ; + PRINTF(") def\n") ; + newsarticle = 1; + PRINTF("/newsarticle true def\n"); + } + + + static char days[] = "SunMonTueWedThuFriSat"; + realfrom(s) + char *s; + { + int i; + + s += 5; + while (*s && isspace(*s)) + s++; + while (*s && !isspace(*s)) + s++; + while (*s && isspace(*s)) + s++; + for (i = 0; i < 21; i += 3) + if ((s[0] == days[i]) && (s[1] == days[i+1]) && (s[2] == days[i+2])) + return(1); + return(0); + } + + boldshow(s) char *s ; { *************** *** 251,256 **** --- 332,341 ---- { endpage() ; startpage() ; + PRINTF("/titleobj (") ; + expand(titleobj) ; + PRINTF(") def\n") ; + PRINTF("/newsarticle %s def\n", (newsarticle ? "true" : "false")); PRINTF("/subject (") ; expand(subject) ; PRINTF(") def\n") ; *** mp.pro.ps.orig Tue Dec 13 16:06:32 1988 --- mp.pro.ps Tue Dec 13 14:56:52 1988 *************** *** 8,13 **** --- 8,15 ---- %%EndComments % + /newsarticle false def + /titleobj (printing) def /subject () def save /nuksunmailsave exch def /font1d /Times-Bold findfont 10 scalefont def *************** *** 48,55 **** closepath 0 setgray stroke 100 740 moveto ! (Mail for ) show ! loginname (\(null\)) eq {(printing)} {loginname} ifelse show fontD timenow stringwidth pop neg 536 add 740 moveto timenow show fontN --- 50,57 ---- closepath 0 setgray stroke 100 740 moveto ! newsarticle { fontD (Article from ) show } { (Mail for ) show } ifelse ! titleobj show fontD timenow stringwidth pop neg 536 add 740 moveto timenow show fontN -- Dave Glowacki ...!pyramid!pwcs!daveg daveg@pwcs.StPaul.GOV