MH 6.7 Updates - part 02/14
John Romine
mh at beanie.ICS.UCI.EDU
Sat Apr 14 07:12:07 AEST 1990
These are patches for MH 6.6 to bring it up to the current release MH
6.7. If you can FTP, you should instead retrieve the current release
(from ics.uci.edu [128.195.1.1] in pub/mh). See the announcement in
comp.mail.mh for all the details. A document descibing the changes
from MH 6.6 can also be found in comp.mail.mh.
There are fourteen parts to these patches; you *must* have all the
parts to compile MH. It will not work if you try to compile an
intermediate version.
Save this message, extract the file below and apply it with "patch -p"
from the top of your MH source tree:
cd mh-6.6/
patch -p < MH.6.6.n
If you have modified your source tree, you'll have to merge your local
changes in after you apply these patches to the original sources.
/JLR
: This is a shar archive. Extract with sh, not csh.
: This archive ends with exit, so do not worry about trailing junk.
echo 'Extracting MH.6.6.1'
sed 's/^X//' > MH.6.6.1 << '+ END-OF-FILE MH.6.6.1'
XPrereq: patch.0
X*** Patchlevel.orig Thu Apr 12 15:55:16 1990
X--- Patchlevel Thu Apr 12 15:55:18 1990
X***************
X*** 1 ****
X! MH.6.6 patch.0
X--- 1 ----
X! MH.6.6 patch.1
X*** ../mh-6.6.0/./conf/config/MailAliases Thu Oct 29 14:54:52 1987
X--- ./conf/config/MailAliases Thu Apr 5 16:05:25 1990
X***************
X*** 2,5 ****
X ; This file is almost empty as MH now supports personal aliases.
X
X! @BEGIN: BBOARDS
X <@(MHETCPATH)/BBoardAliases
X--- 2,6 ----
X ; This file is almost empty as MH now supports personal aliases.
X+ ; @(#)$Id: MailAliases,v 1.3 90/04/05 15:40:57 sources Exp $
X
X! @BEGIN: BBSERVER
X <@(MHETCPATH)/BBoardAliases
X***************
X*** 6,8 ****
X
X! @END: BBOARDS
X ;everyone: *
X--- 7,9 ----
X
X! @END: BBSERVER
X ;everyone: *
X*** ../mh-6.6.0/./conf/config/config.c Thu Oct 29 14:54:54 1987
X--- ./conf/config/config.c Sat Mar 17 09:55:54 1990
X***************
X*** 11,18 ****
X--- 11,23 ----
X #include <stdio.h>
X
X
X+ #if defined(__STDC__) && !defined(__HIGHC__)
X+ #define binpath(file) "@(MHBINPATH)/"#file
X+ #define etcpath(file) "@(MHETCPATH)/"#file
X+ #else
X #define binpath(file) "@(MHBINPATH)/file"
X #define etcpath(file) "@(MHETCPATH)/file"
X+ #endif
X
X
X @(MHCONFIG)
X*** ../mh-6.6.0/./conf/config/mts.c Fri Nov 17 15:44:15 1989
X--- ./conf/config/mts.c Mon Apr 2 14:27:18 1990
X***************
X*** 3,11 ****
X /* LINTLIBRARY */
X
X #undef NETWORK
X! #if defined(BSD41A) || defined(BSD42)
X #define NETWORK
X! #endif not (defined(BSD41A) || defined(BSD42))
X
X #include "../h/strings.h"
X #include <ctype.h>
X--- 3,11 ----
X /* LINTLIBRARY */
X
X #undef NETWORK
X! #if defined(BSD41A) || defined(BSD42) || defined(SOCKETS)
X #define NETWORK
X! #endif not (defined(BSD41A) || defined(BSD42) || defined(SOCKETS))
X
X #include "../h/strings.h"
X #include <ctype.h>
X***************
X*** 12,20 ****
X #include <stdio.h>
X #include "mts.h"
X #ifdef NETWORK
X! #ifdef BSD42
X #include <netdb.h>
X! #endif BSD42
X #else not NETWORK
X #ifndef SYS5
X #include <whoami.h>
X--- 12,20 ----
X #include <stdio.h>
X #include "mts.h"
X #ifdef NETWORK
X! #if defined(BSD42) || defined(SOCKETS)
X #include <netdb.h>
X! #endif BSD42 or SOCKETS
X #else not NETWORK
X #ifndef SYS5
X #include <whoami.h>
X***************
X*** 202,207 ****
X--- 202,210 ----
X "popbbuser", &popbbuser,
X "popbblist", &popbblist,
X #endif BPOP
X+ #ifdef NNTP
X+ "nntphost", &popbbhost,
X+ #endif NNTP
X
X "maildelivery", &maildelivery,
X
X***************
X*** 265,271 ****
X /* */
X
X #define QUOTE '\\'
X- #define grot(x) case 'x': *bp = '\x'; break
X
X static char *tailor_value (s)
X register char *s;
X--- 268,273 ----
X***************
X*** 280,289 ****
X *bp = *s;
X else
X switch (*++s) {
X! grot (b);
X! grot (f);
X! grot (n);
X! grot (t);
X
X case NULL: s--;
X case QUOTE:
X--- 282,293 ----
X *bp = *s;
X else
X switch (*++s) {
X! #define grot(y,z) case y: *bp = z; break;
X! grot ('b', '\b');
X! grot ('f', '\f');
X! grot ('n', '\n');
X! grot ('t', '\t');
X! #undef grot
X
X case NULL: s--;
X case QUOTE:
X***************
X*** 317,328 ****
X #ifdef BSD41A
X char *myname;
X #endif BSD41A
X! #ifdef BSD42
X register struct hostent *hp;
X! #endif BSD42
X! #ifdef SYS5
X struct utsname name;
X! #endif SYS5
X static char buffer[BUFSIZ] = "";
X
X if (buffer[0])
X--- 321,332 ----
X #ifdef BSD41A
X char *myname;
X #endif BSD41A
X! #if defined(BSD42) || defined(SOCKETS)
X register struct hostent *hp;
X! #endif BSD42 or SOCKETS
X! #if defined(SYS5) && !defined(NETWORK)
X struct utsname name;
X! #endif SYS5 and not NETWORK
X static char buffer[BUFSIZ] = "";
X
X if (buffer[0])
X***************
X*** 345,351 ****
X free (myname);
X }
X #endif BSD41A
X! #ifdef BSD42
X (void) gethostname (buffer, sizeof buffer);
X #ifndef BIND
X sethostent (1);
X--- 349,355 ----
X free (myname);
X }
X #endif BSD41A
X! #if defined(BSD42) || defined(SOCKETS)
X (void) gethostname (buffer, sizeof buffer);
X #ifndef BIND
X sethostent (1);
X***************
X*** 352,358 ****
X #endif
X if (hp = gethostbyname (buffer))
X (void) strcpy (buffer, hp -> h_name);
X! #endif BSD42
X #else not NETWORK
X #ifndef SYS5
X (void) strcpy (buffer, SystemName ());
X--- 356,362 ----
X #endif
X if (hp = gethostbyname (buffer))
X (void) strcpy (buffer, hp -> h_name);
X! #endif BSD42 or SOCKETS
X #else not NETWORK
X #ifndef SYS5
X (void) strcpy (buffer, SystemName ());
X***************
X*** 369,377 ****
X /* */
X
X char *SystemName () {
X! #ifdef SYS5
X struct utsname name;
X! #endif SYS5
X static char buffer[BUFSIZ] = "";
X
X if (buffer[0])
X--- 373,381 ----
X /* */
X
X char *SystemName () {
X! #if defined(SYS5) && !defined(NETWORK)
X struct utsname name;
X! #endif SYS5 and not NETWORK
X static char buffer[BUFSIZ] = "";
X
X if (buffer[0])
X***************
X*** 384,395 ****
X #ifdef sysname
X (void) strcpy (buffer, sysname);
X #else sysname
X! #ifndef SYS5
X (void) gethostname (buffer, sizeof buffer);
X! #else SYS5
X (void) uname (&name);
X (void) strcpy (buffer, name.nodename);
X #endif SYS5
X #endif sysname
X
X return buffer;
X--- 388,401 ----
X #ifdef sysname
X (void) strcpy (buffer, sysname);
X #else sysname
X! #if !defined(SYS5) || defined(NETWORK)
X (void) gethostname (buffer, sizeof buffer);
X! #else SYS5 and not NETWORK
X! #ifdef SYS5
X (void) uname (&name);
X (void) strcpy (buffer, name.nodename);
X #endif SYS5
X+ #endif SYS5 and not NETWORK
X #endif sysname
X
X return buffer;
X***************
X*** 463,469 ****
X if ((pw = getpwuid (getuid ())) == NULL
X || pw -> pw_name == NULL
X || *pw -> pw_name == NULL) {
X! (void) strcpy (username, "intruder");
X (void) sprintf (fullname, "The Unknown User-ID (%d)", getuid ());
X return username;
X }
X--- 469,475 ----
X if ((pw = getpwuid (getuid ())) == NULL
X || pw -> pw_name == NULL
X || *pw -> pw_name == NULL) {
X! (void) strcpy (username, "unknown");
X (void) sprintf (fullname, "The Unknown User-ID (%d)", getuid ());
X return username;
X }
X***************
X*** 478,483 ****
X--- 484,497 ----
X for (cp = username; *np && *np != '>'; *cp++ = *np++)
X continue;
X *cp = NULL;
X+ }
X+ /*
X+ * If the fullname contains any .'s, quote it
X+ */
X+ if (index(fullname, '.')) {
X+ char tmp[BUFSIZ];
X+ sprintf (tmp, "\"%s\"", fullname);
X+ strcpy (fullname, tmp);
X }
X if (MMailids == 0 || *np == NULL) {
X (void) strcpy (username, pw -> pw_name);
X*** ../mh-6.6.0/./conf/MH Thu Oct 29 14:54:50 1987
X--- ./conf/MH Fri Apr 6 09:44:34 1990
X***************
X*** 1,11 ****
X! bin /usr/new/mh
X! bboards off
X! etc /usr/new/lib/mh
X mail /usr/spool/mail
X! manuals new
X! mts sendmail/smtp
X! options BSD42 BERK TTYD DUMB
X! options MHE NETWORK BIND RPATHS
X! options SBACKUP='"\\043"'
X! pop off
X! ldoptions -ns -O
X--- 1,9 ----
X! # @(#)$Id: MH,v 1.7 90/04/06 09:44:31 sources Exp $
X! # a 4.2BSD VAX system running SendMail
X! bin /usr/local
X! bboards on
X! etc /usr/local/lib/mh
X mail /usr/spool/mail
X! manuals local
X! mts sendmail
X! options BSD42
X*** /dev/null Thu Apr 12 15:37:43 1990
X--- ./conf/doc/mh-format.rf Thu Apr 5 16:04:32 1990
X***************
X*** 0 ****
X--- 1,458 ----
X+ .\" @(MHWARNING)
X+ .\" @(#)$Id: mh-format.rf,v 1.26 90/04/05 15:09:13 sources Exp $
X+ .SC MH\-FORMAT 5
X+ .NA
X+ mh\-format \- format file for MH message system
X+ .SY
X+ some \fIMH\fR commands
X+ .DE
X+ Several \fIMH\fR commands utilize either a \fIformat\fR string or a
X+ \fIformat\fR file during their execution.
X+ For example,
X+ \fIscan\fR\0(1) uses a format string which directs it how to generate the
X+ scan listing for each message;
X+ \fIrepl\fR\0(1) uses a format file which directs it how to generate the
X+ reply to a message, and so on.
X+
X+ Format strings are designed to be efficiently parsed by \fIMH\fR which
X+ means they are not necessarily simple to write and understand.
X+ This means that novice, casual, or even advanced users of \fIMH\fR should
X+ not have to deal with them.
X+ Some canned scan listing formats are in
X+ @(MHETCPATH)/scan.time, @(MHETCPATH)/scan.size, and @(MHETCPATH)/scan.timely.
X+ Look in @(MHETCPATH) for other \fIscan\fR and \fIrepl\fR format files
X+ which may have been written at your site.
X+
X+ It suffices to have your local \fIMH\fR expert actually write new format
X+ commands or modify existing ones.
X+ This manual section explains how to do that.
X+ Note: familiarity with the C \fIprintf\fR routine is assumed.
X+
X+ A format string consists of ordinary text, and special
X+ multi\-character \fIescape\fR sequences which begin with `%'.
X+ When specifying a format string,
X+ the usual C backslash characters are honored:
X+ `\\b', `\\f', `\\n', `\\r', and `\\t'.
X+ Continuation lines in format files end with `\\' followed
X+ by the newline character.
X+ .\" talk about syntax first, then semantics
X+ There are three types of \fIescape\fR sequences:
X+ header \fIcomponents\fR, built\-in \fIfunctions\fR, and, flow \fIcontrol\fR.
X+
X+ A \fIcomponent\fR escape is specified as `%{\fIcomponent\fR\^}',
X+ and exists for each header found in the message being processed.
X+ For example `%{date}' refers to the \*(lqDate:\*(rq field of the appropriate
X+ message.
X+ All component escapes have a string value.
X+ Normally, component values are compressed by
X+ converting any control characters (tab and newline included) to spaces,
X+ then eliding any leading or multiple spaces.
X+ However,
X+ commands may give different interpretations to some component escapes;
X+ be sure to refer to each command's manual entry for complete details.
X+
X+ A \fIfunction\fR escape is specified as `%(\fIfunction\fR\^)'.
X+ All functions are built\-in, and most have a string or numeric value.
X+
X+ .ne 7
X+ A \fIcontrol\fR escape is one of: `%<', `%|', or `%>'.
X+ These form one of four conditional execution constructs with the
X+ following syntax:
X+ .sp 1
X+ .nf
X+ %<(\fIfunction\fR\^)Command-String%>
X+ %<{\fIcomponent\fR\^}Command-String%>
X+ %<(\fIfunction\fR\^)Then-Command-String%|Else-Command-String%>
X+ %<{\fIcomponent\fR\^}Then-Command-String%|Else-Command-String%>
X+ .fi
X+ .sp
X+ These constructs may be nested without ambiguity.
X+
X+ In the first two forms of the construct,
X+ if the function or component value is non\-zero (for integer\-valued escapes),
X+ or non\-empty (for string\-valued escapes),
X+ then everything up to the corresponding `%>'
X+ is interpreted, otherwise, skip to the corresponding '%>' and
X+ start interpreting again.
X+
X+ In the second two forms of the construct,
X+ the first command string is interpreted
X+ if the function or component value is non\-zero or non\-null,
X+ and the second command string is interpreted otherwise. Only one
X+ of the command strings will be interpreted.
X+ Interpreting the '%|' control escape causes
X+ a skip to the corresponding '%>'.
X+
X+ .ne 10
X+ Most functions expect an argument of a particular type:
X+ .sp 1
X+ .nf
X+ .ta +\w'Argument 'u +\w'An optional component, 'u
X+ \fIArgument\fR \fIDescription\fR \fIExample Syntax\fR
X+ literal A literal number, %(\fIfunc\fR 1234)
X+ or string %(\fIfunc\fR text string)
X+ comp Any header component %(\fIfunc\fR\^{\fIin-reply-to\fR\^})
X+ date A date component %(\fIfunc\fR\^{\fIdate\fR\^})
X+ addr An address component %(\fIfunc\fR\^{\fIfrom\fR\^})
X+ expr An optional component, %(\fIfunc\fR\^(\fIfunc2\fR\^))
X+ function or control, %(\fIfunc\fR %<{\fIreply-to\fR\^}%|%{\fIfrom\fR\^}%>)
X+ perhaps nested %(\fIfunc\fR\^(\fIfunc2\fR\^{\fIcomp\fR\^}))
X+ .re
X+ .fi
X+
X+ The types \fIdate\fR and \fIaddr\fR have the same syntax
X+ as \fIcomp\fR, but require that the header
X+ component be a date string, or address string, respectively.
X+
X+ All arguments except those of type \fIexpr\fR are required.
X+ For the \fIexpr\fR argument type,
X+ the leading `%' must be omitted for component and function escape arguments,
X+ and must be present (with a leading space) for control escape arguments.
X+
X+ The evaluation of format strings
X+ is based on a simple machine with an
X+ integer register \fInum\fR, and a text string register \fIstr\fR.
X+ When a function escape is processed,
X+ if it accepts an optional \fIexpr\fR argument which is not present,
X+ it reads the current value of either \fInum\fR or \fIstr\fR as appropriate.
X+
X+ .\" return values
X+ Component escapes write the value of their message header in \fIstr\fR.
X+ Function escapes write their return value in
X+ \fInum\fR for functions returning \fIinteger\fR or \fIboolean\fR values,
X+ and in \fIstr\fR for functions returning string values.
X+ (The \fIboolean\fR type is a subset of integers with usual
X+ values 0=false and 1=true.)
X+
X+ All component escapes, and those
X+ function escapes which return an \fIinteger\fR or \fIstring\fR value,
X+ pass this value back to their caller
X+ in addition to setting \fIstr\fR or \fInum\fR.
X+ These escapes will print out this value
X+ unless called as part of an argument to another escape sequence.
X+ Function escapes which return a \fIboolean\fR value do pass this value
X+ back to their caller, but will never print out the value.
X+
X+ .nf
X+ .ta \w'Formataddr 'u +\w'Argument 'u +\w'Rboolean 'u
X+ \fIFunction\fR \fIArgument\fR \fIReturn\fR \fIDescription\fR
X+ msg integer message number
X+ cur integer message is current
X+ size integer size of message
X+ strlen integer length of \fIstr\fR
X+ width integer output buffer size in bytes
X+ charleft integer bytes left in output buffer
X+ timenow integer seconds since the UNIX epoch
X+ me string the user's mailbox
X+ eq literal boolean \fInum\fR == \fIarg\fR
X+ ne literal boolean \fInum\fR != \fIarg\fR
X+ gt literal boolean \fInum\fR > \fIarg\fR
X+ match literal boolean \fIstr\fR contains \fIarg\fR
X+ amatch literal boolean \fIstr\fR starts with \fIarg\fR
X+ plus literal integer \fIarg\fR plus \fInum\fR
X+ minus literal integer \fIarg\fR minus \fInum\fR
X+ divide literal integer \fInum\fR divided by \fIarg\fR
X+ num literal integer Set \fInum\fR to \fIarg\fR
X+ lit literal string Set \fIstr\fR to \fIarg\fR
X+ .\" dat literal int ?
X+ nonzero expr boolean \fInum\fR is non\-zero
X+ zero expr boolean \fInum\fR is zero
X+ null expr boolean \fIstr\fR is empty
X+ nonnull expr boolean \fIstr\fR is non\-empty
X+ void expr Set \fIstr\fR or \fInum\fR
X+ comp comp string Set \fIstr\fR to component text
X+ compval comp integer \fInum\fR set to \*(lq\fBatoi\fR(\fIstr\fR\^)\*(rq
X+ .\" compflag comp integer Set \fInum\fR to component flags bits
X+ trim expr trim trailing white\-space from \fIstr\fR
X+ putstr expr print \fIstr\fR
X+ putstrf expr print \fIstr\fR in a fixed width
X+ putnum expr print \fInum\fR
X+ putnumf expr print \fInum\fR in a fixed width
X+ .re
X+ .fi
X+
X+ These functions require a date component as an argument:
X+ .sp 1
X+ .nf
X+ .ta \w'Formataddr 'u +\w'Argument 'u +\w'Rboolean 'u
X+ \fIFunction\fR \fIArgument\fR \fIReturn\fR \fIDescription\fR
X+ sec date integer seconds of the minute
X+ min date integer minutes of the hour
X+ hour date integer hours of the day (0-23)
X+ wday date integer day of the week (Sun=0)
X+ day date string day of the week (abbrev.)
X+ weekday date string day of the week
X+ sday date integer day of the week known?
X+ (0=implicit,\-1=unknown)
X+ mday date integer day of the month
X+ yday date integer day of the year
X+ mon date integer month of the year
X+ month date string month of the year (abbrev.)
X+ lmonth date string month of the year
X+ year date integer year of the century
X+ zone date integer timezone in hours
X+ tzone date string timezone string
X+ szone date integer timezone explicit?
X+ (0=implicit,\-1=unknown)
X+ date2local date coerce date to local timezone
X+ date2gmt date coerce date to GMT
X+ dst date integer daylight savings in effect?
X+ clock date integer seconds since the UNIX epoch
X+ rclock date integer seconds prior to current time
X+ tws date string official 822 rendering
X+ pretty date string user\-friendly rendering
X+ nodate date integer \fIstr\fR not a date string
X+ .re
X+ .fi
X+
X+ .ne 12
X+ These functions require an address component as an argument.
X+ The return value of functions noted with `*' pertain only to
X+ the first address present in the header component.
X+ .sp 1
X+ .nf
X+ .ta \w'Formataddr 'u +\w'Argument 'u +\w'Rboolean 'u
X+ \fIFunction\fR \fIArgument\fR \fIReturn\fR \fIDescription\fR
X+ proper addr string official 822 rendering
X+ friendly addr string user\-friendly rendering
X+ pers addr string the personal name*
X+ note addr string commentary text*
X+ mbox addr string the local mailbox*
X+ mymbox addr integer the user's addresses? (0=no,1=yes)
X+ host addr string the host domain*
X+ nohost addr integer no host was present*
X+ type addr integer host type* (0=local,1=network,
X+ \-1=uucp,2=unknown)
X+ path addr string any leading host route*
X+ ingrp addr integer address was inside a group*
X+ gname addr string name of group*
X+ formataddr expr append \fIarg\fR to \fIstr\fR as a
X+ (comma separated) address list
X+ putaddr literal print \fIstr\fR address list with
X+ \fIarg\fR as optional label;
X+ get line width from \fInum\fR
X+ .re
X+ .fi
X+
X+ When escapes are nested, evaluation is done from inner-most to outer-most.
X+ The outer-most escape must begin with `%'; the inner escapes must not.
X+ For example,
X+
X+ .ti +.5i
X+ %<(mymbox{from} To: %{to}%>
X+
X+ writes the value of the header component \*(lqFrom:\*(rq to \fIstr\fR;
X+ then (\fImymbox\fR\^) reads \fIstr\fR
X+ and writes its result to \fInum\fR;
X+ then the control escape evaluates \fInum\fR. If \fInum\fR is
X+ non-zero, the string \*(lqTo: \*(rq is printed followed by
X+ the value of the header component \*(lqTo:\*(rq.
X+
X+ A minor explanation of (\fImymbox\fR\^{\fIcomp\fR\^}) is in order.
X+ In general, it checks each of the addresses in the header component
X+ \*(lq\fIcomp\fR\*(rq
X+ against the user's mailbox name and any \fIAlternate-Mailboxes\fR.
X+ It returns true if any address matches, however, it
X+ also returns true if the \*(lq\fIcomp\fR\*(rq header is not present
X+ in the message. If needed, the (\fInull\fR\^) function can be
X+ used to explicitly test for this condition.
X+
X+ When a function or component escape is interpreted and the result
X+ will be immediately printed,
X+ an optional field width can be
X+ specified to print the field in exactly a given number of characters.
X+ For example, a numeric escape like %4(\fIsize\fR\^) will print at most 4
X+ digits of the message size; overflow will be indicated by a `?' in the
X+ first position (like `?234').
X+ A string escape like %4(\fIme\fR\^) will print the first 4 characters and
X+ truncate at the end.
X+ Short fields are padded at the right with the fill character (normally,
X+ a blank). If the field width argument begins with a leading zero,
X+ then the fill character is set to a zero.
X+
X+ As above,
X+ the functions (\fIputnumf\fR\^) and (\fIputstrf\fR\^) print their result in
X+ exactly the number of characters specified by their leading field width
X+ argument.
X+ For example,
X+ %06(\fIputnumf\fR\^(\fIsize\fR\^)) will print the message size
X+ in a field six characters wide filled with leading zeros;
X+ %14(\fIputstrf\^\fR{\fIfrom\^\fR}) will print
X+ the \*(lqFrom:\*(rq header component in fourteen characters with
X+ trailing spaces added as needed.
X+ For \fIputstrf\fR,
X+ using a negative value for the field width causes right-justification
X+ of the string within the field,
X+ with padding on the left up to the field width.
X+ The functions (\fIputnum\fR\^) and (\fIputstr\fR\^) print their result in
X+ the minimum number of characters required, and ignore any leading
X+ field width argument.
X+
X+ The available output width is kept in an internal register; any output past
X+ this width will be truncated.
X+
X+ With all this in mind,
X+ here's the default format string for \fIscan\fR.
X+ It's been divided into several pieces for readability.
X+ The first part is:
X+
X+ .ti +.5i
X+ %4(putnumf(msg))%<(cur)+%| %>%<{replied}\-%| %>
X+
X+ which says that the message number should be printed in four digits,
X+ if the message is the current message then a `+' else a space should be
X+ printed,
X+ and if a \*(lqReplied:\*(rq field is present then a `\-' else a space should
X+ be printed.
X+ Next:
X+
X+ .ti +.5i
X+ %02(putnumf(mon{date}))/%02(putnumf(mday{date}))
X+
X+ the month and date are printed in two digits (zero filled) separated by
X+ a slash.
X+ Next,
X+
X+ .ti +.5i
X+ %<{date} %|*>
X+
X+ If a \*(lqDate:\*(rq field was present,
X+ then a space is printed, otherwise a `*'.
X+ Next,
X+
X+ .ti +.5i
X+ %<(mymbox{from})To:%14(putstrf(friendly{to}))
X+
X+ if the message is from me,
X+ print `To:' followed by a \*(lquser\-friendly\*(rq rendering of the
X+ first address in the \*(lqTo:\*(rq field.
X+ Continuing,
X+
X+ .ti +.5i
X+ %|%17(putstrf(friendly{from}))%>
X+
X+ if the message isn't from me,
X+ then the print the \*(lqFrom:\*(rq address is printed.
X+ And finally,
X+
X+ .ti +.5i
X+ %{subject}%<{body}<<%{body}%>
X+
X+ the subject and initial body (if any) are printed.
X+
X+ For a more complicated example, next consider
X+ the default \fIreplcomps\fR format file.
X+
X+ .ti +.5i
X+ %(lit)%(formataddr %<{reply-to}%|
X+
X+ This clears \fIstr\fR and formats the \*(lqReply-To:\*(rq header
X+ if present. If not present, the else clause is executed:
X+
X+ .ti +.5i
X+ %<{from}%|%<{sender}%|%<{return-path}%>%>%>%>)\\
X+
X+ This formats the
X+ \*(lqFrom:\*(rq, \*(lqSender:\*(rq and \*(lqReturn-Path:\*(rq
X+ headers, stopping as soon as one of them is present. Next:
X+
X+ .ti +.5i
X+ %<(nonnull)%(void(width))%(putaddr To: )\\n%>\\
X+
X+ If the \fIformataddr\fR result is non\-null, it is printed as
X+ an address (with line folding if needed) in a field \fIwidth\fR
X+ wide with a leading label of \*(lqTo: \*(rq.
X+
X+ .ti +.5i
X+ %(lit)%(formataddr{to})%(formataddr{cc})%(formataddr(me))\\
X+
X+ \fIstr\fR is cleared, and the
X+ \*(lqTo:\*(rq and \*(lqCc:\*(rq headers, along with the user's
X+ address
X+ (depending on what was specified with
X+ the \*(lq\-cc\*(rq switch to \fIrepl\fR\^) are formatted.
X+
X+ .ti +.5i
X+ %<(nonnull)%(void(width))%(putaddr cc: )\\n%>\\
X+
X+ If the result is non\-null, it is printed as above with a
X+ leading label of \*(lqcc: \*(rq.
X+
X+ .ti +.5i
X+ %<{fcc}Fcc: %{fcc}\\n%>\\
X+
X+ If a \*(lq\-fcc\ folder\*(rq switch was given to \fIrepl\fR
X+ (see \fIrepl\fR\0(1) for more details about %{\fIfcc\fR\^}),
X+ an \*(lqFcc:\*(rq header is output.
X+
X+ .ti +.5i
X+ %<{subject}Subject: Re: %{subject}\\n%>\\
X+
X+ If a subject component was present,
X+ a suitable reply subject is output.
X+
X+ .nf
X+ .ti +.5i
X+ %<{date}In-reply-to: Your message of "\\
X+ .ti +.5i
X+ %<(nodate{date})%{date}%|%(tws{date})%>."%<{message-id}
X+ .ti +.5i
X+ %{message-id}%>\\n%>\\
X+ .ti +.5i
X+ --------
X+ .fi
X+
X+ If a date component was present,
X+ an \*(lqIn-Reply-To:\*(rq header is output with the preface
X+ \*(lqYour message of \*(rq. If the date was parseable, it is
X+ output in official format, otherwise it is output as\-is.
X+ The message-id is included if present.
X+ As with all plain\-text,
X+ the row of dashes are output as\-is.
X+
X+ This last part is a good example for a little more elaboration.
X+ Here's that part again in pseudo\-code:
X+ .sp 1
X+ .nf
X+ .in +.5i
X+ .ta .5i 1i 1.5i 2i
X+ if (comp_exists(date)) then
X+ print (\*(lqIn-reply-to: Your message of \\\*(lq\*(rq)
X+ if (not_date_string(date.value) then
X+ print (date.value)
X+ else
X+ print (rfc822(date.value))
X+ endif
X+ print (\*(lq\\\*(rq\*(rq)
X+ if (comp_exists(message-id)) then
X+ print (\*(lq\\n\\t\*(rq)
X+ print (message-id.value)
X+ endif
X+ print (\*(lq\\n\*(rq)
X+ endif
X+ .re
X+ .in -.5i
X+ .fi
X+ .sp 1
X+ Although this seems complicated,
X+ in point of fact,
X+ this method is flexible enough to extract individual fields and print them in
X+ any format the user desires.
X+ .Fi
X+ None
X+ .Pr
X+ None
X+ .Sa
X+ scan(1), repl(1), ap(8), dp(8)
X+ .De
X+ None
X+ .Co
X+ None
X+ .Hi
X+ This software was contributed for MH 6.3. Prior to this, output
X+ format specifications were much easier to write, but considerably
X+ less flexible.
X+ .Bu
X+ On hosts where \fIMH\fR was configured with the BERK option,
X+ address parsing is not enabled.
X+ .En
X*** ../mh-6.6.0/./conf/doc/tmac.h Thu Oct 29 14:55:34 1987
X--- ./conf/doc/tmac.h Thu Apr 5 16:04:04 1990
X***************
X*** 1,4 ****
X--- 1,5 ----
X .\" @(MHWARNING)
X+ .\" @(#)$Id: tmac.h,v 1.5 90/04/05 15:40:17 sources Exp $
X .\" Try to keep only one copy of the documentation around
X .\" by re-defining macros and so forth.
X .\"
X***************
X*** 6,12 ****
X .\" I pity the fool who tampers with the next line...
X .ds ZZ -man
X .de SC \" Title section
X! .TH \\$1 \\$2 MH [mh.6]
X ..
X .de NA \" Name section
X .SH NAME
X--- 7,13 ----
X .\" I pity the fool who tampers with the next line...
X .ds ZZ -man
X .de SC \" Title section
X! .TH \\$1 \\$2 @(MHCENTERFOOT) @(MHLEFTFOOT)
X ..
X .de NA \" Name section
X .SH NAME
X*** ../mh-6.6.0/./conf/doc/ali.rf Thu Oct 29 14:55:01 1987
X--- ./conf/doc/ali.rf Thu Apr 5 16:04:34 1990
X***************
X*** 1,2 ****
X--- 1,3 ----
X .\" @(MHWARNING)
X+ .\" @(#)$Id: ali.rf,v 1.6 90/04/05 15:09:39 sources Exp $
X .SC ALI 1
X***************
X*** 28,29 ****
X--- 29,32 ----
X
X+ The file specified by the profile entry \*(lqAliasfile:\*(rq and any
X+ additional alias files given by the `\-alias aliasfile' switch will be read.
X Each \fIalias\fR is processed as described in \fImh\-alias\fR\0(5).
X***************
X*** 34,36 ****
X .Pr
X! None
X .Sa
X--- 37,41 ----
X .Pr
X! ^Path:~^To determine the user's MH directory
X! .Ps
X! ^Aliasfile:~^For a default alias file
X .Sa
X*** ../mh-6.6.0/./conf/doc/msh.rf Thu Oct 29 14:55:24 1987
X--- ./conf/doc/msh.rf Thu Apr 5 16:04:57 1990
X***************
X*** 1,2 ****
X--- 1,3 ----
X .\" @(MHWARNING)
X+ .\" @(#)$Id: msh.rf,v 1.8 90/04/05 15:13:40 sources Exp $
X .SC MSH 1
X***************
X*** 215,216 ****
X--- 216,220 ----
X both the shell and \fImsh\fR.
X+
X+ \fIsortm\fR always uses \*(lq\-noverbose\*(rq and
X+ if \*(lq\-textfield\ field\*(lq is used, \*(lq\-limit 0\*(rq.
X
X*** ../mh-6.6.0/./conf/doc/anno.rf Fri Nov 17 15:44:16 1989
X--- ./conf/doc/anno.rf Thu Apr 5 16:04:24 1990
X***************
X*** 1,2 ****
X--- 1,3 ----
X .\" @(MHWARNING)
X+ .\" @(#)$Id: anno.rf,v 2.4 90/04/05 15:08:00 sources Exp $
X .SC ANNO 1
X***************
X*** 9,10 ****
X--- 10,12 ----
X \%[\-inplace] \%[\-noinplace]
X+ \%[\-date] \%[\-nodate]
X \%[\-text\ body]
X***************
X*** 25,26 ****
X--- 27,30 ----
X
X+ The `\-nodate' switch inhibits the date annotation,
X+ leaving only the body annotation.
X The `\-inplace' switch causes annotation to be done in place in order
X***************
X*** 48,49 ****
X--- 52,55 ----
X `\-noinplace'
X+ .Ds
X+ `\-date'
X .Co
X*** ../mh-6.6.0/./conf/doc/ap.rf Thu Oct 29 14:55:02 1987
X--- ./conf/doc/ap.rf Thu Apr 5 16:04:38 1990
X***************
X*** 1,2 ****
X--- 1,3 ----
X .\" @(MHWARNING)
X+ .\" @(#)$Id: ap.rf,v 1.6 90/04/05 15:10:21 sources Exp $
X .SC AP 8
X***************
X*** 30,36 ****
X In addition to the standard escapes,
X! \fIscan\fR also recognizes the following additional escape:
X .nf
X! .ta \w'escape 'u
X! \fIescape\fR \fIsubstitution\fR
X! error a diagnostic if the parse failed
X .re
X--- 31,38 ----
X In addition to the standard escapes,
X! \fIap\fR also recognizes the following additional escape:
X! .sp 1
X .nf
X! .ta \w'Escape 'u +\w'Returns 'u
X! \fIEscape\fR \fIReturns\fR \fIDescription\fR
X! error string A diagnostic if the parse failed
X .re
X*** ../mh-6.6.0/./conf/doc/bbaka.rf Thu Oct 29 14:55:02 1987
X--- ./conf/doc/bbaka.rf Thu Apr 5 16:04:42 1990
X***************
X*** 1,2 ****
X--- 1,3 ----
X .\" @(MHWARNING)
X+ .\" @(#)$Id: bbaka.rf,v 1.5 90/04/05 15:11:03 sources Exp $
X .SC BBAKA 8
X*** ../mh-6.6.0/./conf/doc/bbc.rf Thu Oct 29 14:55:03 1987
X--- ./conf/doc/bbc.rf Thu Apr 5 16:04:23 1990
X***************
X*** 1,2 ****
X--- 1,3 ----
X .\" @(MHWARNING)
X+ .\" @(#)$Id: bbc.rf,v 2.4 90/04/05 15:07:52 sources Exp $
X .SC BBC 1
X***************
X*** 19,20 ****
X--- 20,24 ----
X @END: BPOP
X+ @BEGIN: NNTP
X+ \%[\-host\ host]
X+ @END: NNTP
X \%[\-help]
X***************
X*** 118,119 ****
X--- 122,132 ----
X @END: BPOP
X+ @BEGIN: NNTP
X+
X+ If the local host is configured as an NNTP BBoards client,
X+ or if the `\-host\ host' switch is given,
X+ then \fIbbc\fR will query the NNTP service host
X+ as to the status of the BBoards.
X+ For NNTP BBoards clients,
X+ the `\-user\ user' and the `\-rpop' switches are ignored.
X+ @END: NNTP
X
X*** ../mh-6.6.0/./conf/doc/bbexp.rf Thu Oct 29 14:55:03 1987
X--- ./conf/doc/bbexp.rf Thu Apr 5 16:04:42 1990
X***************
X*** 1,2 ****
X--- 1,3 ----
X .\" @(MHWARNING)
X+ .\" @(#)$Id: bbexp.rf,v 1.5 90/04/05 15:11:10 sources Exp $
X .SC BBEXP 8
X*** ../mh-6.6.0/./conf/doc/bbl.rf Thu Oct 29 14:55:03 1987
X--- ./conf/doc/bbl.rf Thu Apr 5 16:04:43 1990
X***************
X*** 1,2 ****
X--- 1,3 ----
X .\" @(MHWARNING)
X+ .\" @(#)$Id: bbl.rf,v 1.5 90/04/05 15:11:17 sources Exp $
X .SC BBL 1
X*** ../mh-6.6.0/./conf/doc/bbleader.rf Thu Oct 29 14:55:05 1987
X--- ./conf/doc/bbleader.rf Thu Apr 5 16:04:44 1990
X***************
X*** 1,2 ****
X--- 1,3 ----
X .\" @(MHWARNING)
X+ .\" @(#)$Id: bbleader.rf,v 1.5 90/04/05 15:11:34 sources Exp $
X .SC BBLEADER 1
X*** ../mh-6.6.0/./conf/doc/bboards.rf Thu Oct 29 14:55:05 1987
X--- ./conf/doc/bboards.rf Thu Apr 5 16:04:44 1990
X***************
X*** 1,2 ****
X--- 1,3 ----
X .\" @(MHWARNING)
X+ .\" @(#)$Id: bboards.rf,v 1.5 90/04/05 15:11:40 sources Exp $
X .SC BBOARDS 1
X*** ../mh-6.6.0/./conf/doc/bboards5.rf Thu Oct 29 14:55:06 1987
X--- ./conf/doc/bboards5.rf Thu Apr 5 16:04:45 1990
X***************
X*** 1,2 ****
X--- 1,3 ----
X .\" @(MHWARNING)
X+ .\" @(#)$Id: bboards5.rf,v 1.5 90/04/05 15:11:49 sources Exp $
X .SC BBOARDS 5
X*** ../mh-6.6.0/./conf/doc/bboards8.rf Thu Oct 29 14:55:06 1987
X--- ./conf/doc/bboards8.rf Thu Apr 5 16:04:45 1990
X***************
X*** 1,2 ****
X--- 1,3 ----
X .\" @(MHWARNING)
X+ .\" @(#)$Id: bboards8.rf,v 1.5 90/04/05 15:11:57 sources Exp $
X .SC BBOARDS 8
X*** ../mh-6.6.0/./conf/doc/bbtar.rf Thu Oct 29 14:55:07 1987
X--- ./conf/doc/bbtar.rf Thu Apr 5 16:04:46 1990
X***************
X*** 1,2 ****
X--- 1,3 ----
X .\" @(MHWARNING)
X+ .\" @(#)$Id: bbtar.rf,v 1.5 90/04/05 15:12:03 sources Exp $
X .SC BBTAR 8
X*** ../mh-6.6.0/./conf/doc/burst.rf Thu Oct 29 14:55:07 1987
X--- ./conf/doc/burst.rf Thu Apr 5 16:04:47 1990
X***************
X*** 1,2 ****
X--- 1,3 ----
X .\" @(MHWARNING)
X+ .\" @(#)$Id: burst.rf,v 1.5 90/04/05 15:12:10 sources Exp $
X .SC BURST 1
X*** ../mh-6.6.0/./conf/doc/comp.rf Thu Oct 29 14:55:08 1987
X--- ./conf/doc/comp.rf Thu Apr 5 16:04:47 1990
X***************
X*** 1,2 ****
X--- 1,3 ----
X .\" @(MHWARNING)
X+ .\" @(#)$Id: comp.rf,v 1.5 90/04/05 15:12:17 sources Exp $
X .SC COMP 1
X*** ../mh-6.6.0/./conf/doc/conflict.rf Thu Oct 29 14:55:08 1987
X--- ./conf/doc/conflict.rf Thu Apr 5 16:04:48 1990
X***************
X*** 1,2 ****
X--- 1,3 ----
X .\" @(MHWARNING)
X+ .\" @(#)$Id: conflict.rf,v 1.5 90/04/05 15:12:24 sources Exp $
X .SC CONFLICT 8
X*** ../mh-6.6.0/./conf/doc/dist.rf Thu Oct 29 14:55:09 1987
X--- ./conf/doc/dist.rf Thu Apr 5 16:04:49 1990
X***************
X*** 1,2 ****
X--- 1,3 ----
X .\" @(MHWARNING)
X+ .\" @(#)$Id: dist.rf,v 1.5 90/04/05 15:12:30 sources Exp $
X .SC DIST 1
X*** ../mh-6.6.0/./conf/doc/dp.rf Thu Oct 29 14:55:09 1987
X--- ./conf/doc/dp.rf Thu Apr 5 16:04:30 1990
X***************
X*** 1,2 ****
X--- 1,3 ----
X .\" @(MHWARNING)
X+ .\" @(#)$Id: dp.rf,v 1.6 90/04/05 15:08:58 sources Exp $
X .SC DP 8
X***************
X*** 32,33 ****
X--- 33,35 ----
X
X+ .nf
X .ti +.5i
X***************
X*** 34,35 ****
X--- 36,38 ----
X %<(nodate{text})error: %{text}%|%(putstr(pretty{text}))%>
X+ .fi
X
X*** ../mh-6.6.0/./conf/doc/folder.rf Thu Oct 29 14:55:10 1987
X--- ./conf/doc/folder.rf Thu Apr 5 16:04:49 1990
X***************
X*** 1,2 ****
X--- 1,3 ----
X .\" @(MHWARNING)
X+ .\" @(#)$Id: folder.rf,v 1.5 90/04/05 15:12:37 sources Exp $
X .SC FOLDER 1
X*** ../mh-6.6.0/./conf/doc/forw.rf Thu Oct 29 14:55:10 1987
X--- ./conf/doc/forw.rf Thu Apr 5 16:04:29 1990
X***************
X*** 1,2 ****
X--- 1,3 ----
X .\" @(MHWARNING)
X+ .\" @(#)$Id: forw.rf,v 1.9 90/04/05 15:08:44 sources Exp $
X .SC FORW 1
X***************
X*** 109,111 ****
X
X! Each forwarded message is separated with an encapsulation delimiter so that
X when received, the message is suitable for bursting by \fIburst\fR\0(1).
X--- 110,115 ----
X
X! Each forwarded message is separated with an encapsulation delimiter
X! and
X! dashes in the first column of the forwarded messages will be prepended
X! with `\-\ ' so that
X when received, the message is suitable for bursting by \fIburst\fR\0(1).
X***************
X*** 132,135 ****
X The `\-digest\ list', `\-issue\ number', and `\-volume\ number' switches
X! implement a digest facility for \fIMH\fR.
X! See the \fIMH\fR user's manual for more information.
X .Fi
X--- 136,151 ----
X The `\-digest\ list', `\-issue\ number', and `\-volume\ number' switches
X! implement a digest facility for \fIMH\fR. Specifying these switches
X! enables and/or overloads the following escapes:
X! .sp 1
X! .nf
X! .ta \w'Component 'u +\w'Escape 'u +\w'Returns 'u
X! \fIType\fR \fIEscape\fR \fIReturns\fR \fIDescription\fR
X! \fIcomponent\fR \fIdigest\fR string Argument to `\-digest'
X! \fIfunction\fR \fIcur\fR integer Argument to `\-volume'
X! \fIfunction\fR \fImsg\fR integer Argument to `\-issue'
X! .re
X! .fi
X!
X! Consult the \fBAdvanced Features\fR section of
X! the \fIMH\fR User's Manual for more information on making digests.
X .Fi
X***************
X*** 162,164 ****
X .br
X! comp(1), dist(1), repl(1), send(1), whatnow(1)
X .De
X--- 178,180 ----
X .br
X! comp(1), dist(1), repl(1), send(1), whatnow(1), mh\-format(5)
X .De
X*** ../mh-6.6.0/./conf/doc/mh.rf Thu Oct 29 14:55:20 1987
X--- ./conf/doc/mh.rf Thu Apr 5 16:04:30 1990
X***************
X*** 1,2 ****
X--- 1,3 ----
X .\" @(MHWARNING)
X+ .\" @(#)$Id: mh.rf,v 1.9 90/04/05 15:08:50 sources Exp $
X .if '\*(ZZ'-man' \{\
X***************
X*** 148,149 ****
X--- 149,151 ----
X ^bbc (1)~^\- check on BBoards
X+ @BEGIN: BBSERVER
X ^bbl (1)~^\- manage a BBoard
X***************
X*** 150,151 ****
X--- 152,154 ----
X ^bbleader (1)~^\- responsiblities of a BBoard\-leader
X+ @END: BBSERVER
X ^bboards (1)~^\- the UCI BBoards facility
X***************
X*** 213,219 ****
X .Sa
X! \fIThe Rand \fIMH\fR Message Handling System: User's Manual\fR,
X .br
X! \fIThe Rand \fIMH\fR Message Handling System: Tutorial\fR,
X .br
X! \fIThe Rand \fIMH\fR Message Handling System: The UCI BBoards Facility\fR,
X .br
X--- 216,222 ----
X .Sa
X! \fIThe RAND \fIMH\fR Message Handling System: User's Manual\fR,
X .br
X! \fIThe RAND \fIMH\fR Message Handling System: Tutorial\fR,
X .br
X! \fIThe RAND \fIMH\fR Message Handling System: The UCI BBoards Facility\fR,
X .br
X***************
X*** 222,223 ****
X--- 225,280 ----
X .br
X+ .Bu
X+ If problems are encountered with an \fIMH\fR program,
X+ the problems should be reported to the local maintainers of \fIMH\fR.
X+ When doing this,
X+ the name of the program should be reported,
X+ along with the version information for the program.
X+ .br
X+ To find out what version of an \fIMH\fR program is being run,
X+ invoke the program with the `\-help' switch.
X+ In addition to listing the syntax of the command,
X+ the program will list information pertaining to its version.
X+ This information includes the version of \fIMH\fR,
X+ the host it was generated on,
X+ and the date the program was loaded.
X+ A second line of information,
X+ found on versions of \fIMH\fR after #5.380 include \fIMH\fR configuration
X+ options.
X+ For example,
X+
X+ .nf
X+ .in +.5i
X+ version: MH 6.1 #1[UCI] (glacier) of Wed Nov 6 01:13:53 PST 1985
X+ options: [BSD42] [MHE] [NETWORK] [SENDMTS] [MMDFII] [SMTP] [POP]
X+ .in -.5i
X+ .fi
X+
X+ The `6.1 #1[UCI]' indicates that the program is from the UCI \fIMH.6.1\fR
X+ version of \fIMH\fR.
X+ The program was generated on the host `glacier' on
X+ `Wed Nov 6 01:13:53 PST 1985'.
X+ It's usually a good idea to send the output of the `\-help' switch along
X+ with your report.
X+
X+ If there is no local \fIMH\fR maintainer,
X+ try the address \fBBug-MH\fR.
X+ If that fails, use the Internet mailbox \fBBug-MH at ICS.UCI.EDU\fR.
X+ .Fi
X+ ^$HOME/\&.mh\(ruprofile~^The user profile
X+ .Pr
X+ ^Path:~^To determine the user's MH directory
X+ .\" .Ps
X+ .\" for each additional profile entry
X+ .\" .Sa
X+ .\" the see\-also's go here
X+ .\" .De
X+ .\" the first default goes here
X+ .\" .Ds
X+ .\" for each additional default
X+ .\" .Co
X+ .\" context changes go here
X+ .\" You can also have
X+ .\" .Hh \- the helpful hints section
X+ .\" .Hi \- the history section
X+ .\" .Bu \- the bugs section
X .En
X*** ../mh-6.6.0/./conf/doc/mark.rf Thu Oct 29 14:55:12 1987
X--- ./conf/doc/mark.rf Thu Apr 5 16:04:50 1990
X***************
X*** 1,2 ****
X--- 1,3 ----
X .\" @(MHWARNING)
X+ .\" @(#)$Id: mark.rf,v 1.5 90/04/05 15:12:51 sources Exp $
X .SC MARK 1
X*** ../mh-6.6.0/./conf/doc/mf.rf Thu Oct 29 14:55:13 1987
X--- ./conf/doc/mf.rf Thu Apr 5 16:04:51 1990
X***************
X*** 1,2 ****
X--- 1,3 ----
X .\" @(MHWARNING)
X+ .\" @(#)$Id: mf.rf,v 1.5 90/04/05 15:12:57 sources Exp $
X .SC MF 1
+ END-OF-FILE MH.6.6.1
chmod 'u=rw,g=r,o=r' 'MH.6.6.1'
echo ' -rw-r--r-- 1 mh 36893 Apr 13 13:53 MH.6.6.1 (as sent)'
echo -n ' '
/bin/ls -l MH.6.6.1
exit 0
More information about the Comp.sources.bugs
mailing list