home *** CD-ROM | disk | FTP | other *** search
/ back2roots/padua / padua.7z / padua / uucp / unpost.lha / unpost.man < prev   
Text File  |  1993-02-07  |  25KB  |  650 lines

  1. UNPOST
  2.  
  3. Name:
  4.  
  5.     unpost - Extract binary files from multi-segment uuencoded USENET
  6.              postings or Email.
  7.  
  8. Synopsis:
  9.  
  10.     unpost -f[-] -d[-] -c config -e errors -t text -i incompletes [file]
  11.  
  12. Description:
  13.  
  14.     UNPOST is a tool designed primarily to extract binaries from USENET
  15.     binaries postings such as those made to alt.binaries.pictures.misc
  16.     and comp.binaries.ibm.pc.  As well as extracting binaries from USENET
  17.     postings, UNPOST can extract binaries from multi-segment uuencoded
  18.     mailings as well, however, to simplify this documentation only
  19.     USENET article postings will be discussed.  The principles are the
  20.     same for multi-segment mailings.
  21.  
  22.     UNPOST assumes that the source file that is given to it will have the
  23.     following format:
  24.  
  25.     SEGMENT begin line
  26.     ...
  27.     HEADER ID line
  28.     ...
  29.     BODY ID line
  30.     ...
  31.     UUENCODED line
  32.  
  33.     The lines are:
  34.  
  35.         SEGMENT begin line - Is the line that identifies the begining of a
  36.                              segment.
  37.         HEADER ID line     - One or more lines that contain segment number,
  38.                              total number of segments or the ID string in
  39.                              the article or mail header.
  40.         BODY ID line       - One or more lines that contain segment number,
  41.                              total number of segments or the ID string in
  42.                              the article or mail message body.
  43.         UUENCODED line     - Is the first uuencoded line in the file.
  44.                              UUencoded lines include the begin and end lines.
  45.         ...                - Indicates zero or more lines that can contain
  46.                              any information so long as they CANNOT be
  47.                              misidentified as SEGMENT begin, ID or UUENCODED
  48.                              lines.
  49.  
  50.     Notice that the ID information can be spread across multiple lines.  A
  51.     segment is assumed to end at the begining of the next segment, or at
  52.     the end of the source file.  An UNPOST source file contains one or more
  53.     segments.
  54.  
  55.     UNPOST has three different modes, interpretation mode, concatenation
  56.     mode and UU decoder mode.  In all three modes, UNPOST can accept one
  57.     or more input files.
  58.  
  59.     In the first mode, interpretation mode, UNPOST looks at article header
  60.     and body lines before the first UU encoded line, and attempts to extract
  61.     three pieces of information from them: segment number, total number
  62.     of segments that the binary was split into, and an ID string that is
  63.     common to all segments.  If UNPOST finds something that it considers
  64.     to be an ID string, and a uuencoded line in the article, but it does
  65.     not find a segment number and number of segments, UNPOST assumes that
  66.     the article is a single segment binary posting (part 1 of 1).
  67.  
  68.     To aid in finding out what happened, in interpretation mode UNPOST
  69.     will write a list of all the different ID strings and their respective
  70.     segment lists to standard error or the file specified as the error
  71.     file (see Standards section for details of what an ID string is).
  72.     Any errors or warnings detected during processing will also be
  73.     written to standard error or error file.
  74.  
  75.     In interpretation mode three other files can optionally be created.
  76.     All three of these files will contain segments copied out of the source
  77.     file, and none of these files will be created unless they are turned
  78.     on and named by a command line switch.
  79.  
  80.     The first optional file that UNPOST can create for the user in
  81.     interpretation mode is the text file (-t switch).  This file will have
  82.     copied to it all segments from the source file that do not contain
  83.     uuencoded data.
  84.  
  85.     Segments that are part 0/# type segments that do not contain uuencoded
  86.     data will NOT be copied to the text file.  They are considered to be
  87.     description segments, and they will be copied to the description file
  88.     only if the -d switch is turned on.  Also, all binary postings that
  89.     have all of their segments present will have the segment header
  90.     and body of segment #1 (up to and including the uuencode begin line)
  91.     copied into the description file.
  92.  
  93.     The third optional file that can be created in interpretation mode is
  94.     the incomplete or unused uuencode data segments file.  This file
  95.     contains all segments that have uuencoded data, that were not used in
  96.     a succesful uudecoding.  This file will only be created if the -i
  97.     switch is present.
  98.  
  99.     The incompletes file allows the user to hand decode those binarys which
  100.     could not be interpreted or decoded by UNPOST.  Often times, a binary
  101.     will have all of it's parts, but UNPOST will not be able to put them
  102.     together because of differences in the ID string between segments, or
  103.     problems with the part numbering information.  The simplest way to
  104.     solve these problems is to collect the incompletes, edit the ID
  105.     lines to correct the problem, and rerun UNPOST on the incompletes
  106.     file.
  107.  
  108.     In the second mode, catentation mode, UNPOST assumes that all of the
  109.     segments in the source file between a uuencode begin and a uuencode
  110.     end line are part of one binary posting and that the segments are in
  111.     order.  UNPOST scans from the begining of the file until it finds a
  112.     uuencode begin line, and decodes from there (skipping over non-
  113.     uuencoded lines such as article header lines and signatures) until
  114.     it finds a uuencode end line.
  115.  
  116.     In the last mode, UU decoder mode, UNPOST assumes that the source
  117.     file contains one or more UU encoded files.  Only UU encoded lines
  118.     are allowed between the uuencode begin line and the uuencode end line
  119.     of any single uuencoded file.
  120.  
  121. Options:
  122.  
  123.     -c  <file>  To read and use a different configuration than the
  124.                 default configuration.  The default configuration is
  125.                 stored in a file called def.cfg.
  126.  
  127.     -d          Turns on description capturing and writes descriptions
  128.                 to a file that has the same name as the output but with
  129.                 a .inf extension.  This defaults to off.
  130.  
  131.     -e  <file>  Redirects error and information output from standard
  132.                 error to <file>.
  133.  
  134.     -f[-]       Modify file names to be MS-DOS compatible.  Use of -f
  135.                 turns file name modification on if the default is off,
  136.                 and -f- turns file name modification off if the default
  137.                 is on.  File name modification is currently the default.
  138.  
  139.     -h          Turns on full interpretation mode.  This is the default.
  140.  
  141.     -i  <file>  Turns on incomplete binaries capturing and writes the
  142.                 segments to file <file>.
  143.  
  144.     -s          Switch to ordered segment mode.  This mode ignores article
  145.                 headers, and assumes that the segments are in order.
  146.  
  147.     -t  <file>  Turns on text only segment capturing and writes the segments
  148.                 to <file>.
  149.  
  150.     -u          Switch to uudecoder mode.  Assume only uuencoded data
  151.                 between begin and end lines.  Multiple uuencoded files
  152.                 are allowed.
  153.  
  154.     -?          Show a summary of the command line switches.
  155.  
  156.     It is important to realize that UNPOST
  157.  
  158. Standards:
  159.  
  160.     In all modes, UNPOST recognizes and decodes only uuencoded data.
  161.  
  162.     In interpretation mode UNPOST requires that:
  163.  
  164.         1)  The uuencoded lines be true uuencoded lines.  This means
  165.             that if trailing spaces are truncated by a mailer, editor
  166.             or news node, UNPOST will not consider those lines to
  167.             be uuencoded lines.  Also, the uuencode character set
  168.             recognized by UNPOST is ' ' - '`', with no other characters
  169.             being legal.
  170.  
  171.         2)  That all segments of the same binary file posting have
  172.             the same, recognizable ID string.
  173.  
  174.         3)  Segments have a recognizable SEGMENT begin line as the
  175.             first line in the segment (denoting the begining of a
  176.             segment).
  177.  
  178.         4)  That all ID lines follow the SEGMENT begin line in the
  179.             segment.
  180.  
  181.         5)  That the first UUencoded line of the segment follows the
  182.             last ID line.
  183.  
  184.         6)  That the first uuencode line in the first segment be a
  185.             begin line.
  186.  
  187.         7)  That the last segment contain a uuencode end line.
  188.  
  189.     In sorted segment mode, UNPOST requires that:
  190.  
  191.         1)  The uuencoded lines be true uuencoded lines.  This means
  192.             that if trailing spaces are truncated by a mailer, editor
  193.             or news node, UNPOST will not consider those lines to
  194.             be uuencoded lines.  Also, the uuencode character set
  195.             recognized by UNPOST is ' ' - '`', with no other characters
  196.             being legal.
  197.  
  198.         2)  That the segments be stored in the file in order.
  199.  
  200.         3)  That the first uuencode line in the first segment be a
  201.             begin line.
  202.  
  203.         4)  That the last segment contain a uuencode end line.
  204.  
  205.     In uudecoder mode, UNPOST requires that:
  206.  
  207.         1)  There be only uuencoded lines between a uuencode begin and
  208.             a uuencode end line.  In this mode, UNPOST will recognize
  209.             and attempt to repair lines that had trailing spaces
  210.             truncated.
  211.  
  212. Examples:
  213.  
  214.     To extract a single binary that had all of it's segments saved in order
  215.     to a single file:
  216.  
  217.     unpost -s binary.uue
  218.  
  219.     To extract all binaries that have had all of their segments saved
  220.     to a single file:
  221.  
  222.     unpost multiple.uue 2> errors
  223.         Or
  224.     unpost -e errors multiple.uue
  225.  
  226.     The file errors will contain a list of all the ID strings that UNPOST
  227.     found and thought could have been binary files, and any errors
  228.     that occurred during processing.
  229.  
  230.     To capture the incomplete or unused segments that have uuencoded
  231.     data in them:
  232.  
  233.     unpost -e errors -i multiple.inc multiple.uue
  234.  
  235.     To capture descriptions and text only segments as well:
  236.  
  237.     unpost -d -e errors -t text -i multiple.inc multiple.uue
  238.  
  239.     To process two different files, one in uuencode mode, one in interpretation
  240.     mode:
  241.  
  242.     unpost -e errors -u uuencode.uue -h multiple.uue
  243.  
  244.     To process a file that requires a different configuration:
  245.  
  246.     unpost -c -e errors multiple.uue
  247.  
  248. Notes:
  249.  
  250.     To use this program to collect all of the binaries posted to, say,
  251.     the alt.binaries.misc group on a daily basis, start up rn, go to
  252.     the alt.binaries.misc newsgroup, and save all of the unread articles
  253.     by using this command:
  254.  
  255.     .-$smisc.uue:j
  256.  
  257.     This will save all articles from the current number to the last to
  258.     the file misc.uue, then junk them.  After exiting rn, run UNPOST
  259.     on the file misc.uue in interpretation mode (default mode):
  260.  
  261.     unpost -e errors -i misc.1 misc.uue
  262.  
  263.     Make sure to check the errors and/or misc.1 file for segments
  264.     that UNPOST couldn't extract.
  265.  
  266. Diagnostics:
  267.  
  268.     Error - file 'filename' already exists.
  269.  
  270.         UNPOST will not overwrite an existing file.  Delete the file or
  271.         rename it and try again.
  272.  
  273.     Error - missing begin line.
  274.  
  275.         UNPOST expected to find a uuencode begin line in this segment,
  276.         but did not.
  277.  
  278.     Error - Could not open description file 'filename' for writing.
  279.  
  280.         UNPOST could not open a file of that name for some reason.
  281.         Possibly a permission problem, or the file exists and is not
  282.         writeable.
  283.  
  284.     Error - Bad write to binary file.
  285.  
  286.         A file write failed for some unknown reason.  Possibly a full
  287.         disk?
  288.  
  289.     Error - missing segment #
  290.         Binary ID: 'binaryID'
  291.  
  292.         In attempting to decode a file whose ID string is binaryID,
  293.         one or more segments are missing.
  294.  
  295.     Error - Missing UU end line.
  296.  
  297.         As this is the last segment, it ought to have a uuencode end
  298.         line in it, but UNPOST did not find one.
  299.  
  300.     Warning - Early uuencode end line.
  301.  
  302.         UNPOST found a uuencode end line, but this was not the last
  303.         segment, so we found it early.  Did the poster screw up and
  304.         misnumber his segments?
  305.  
  306.     Error - Unexpected UU begin line.
  307.  
  308.         We found an unexpected (read: this is not the first line of the
  309.         first segment, so what is this doing here?) UU begin line.
  310.  
  311.     Error - cannot identify string '' in line #
  312.  
  313.         In reading in a configuration file, the configuration file
  314.         lexical analyzer could not recognize this string.
  315.  
  316.  
  317.     Error - Out of memory.
  318.  
  319.             Yup.  Out of memory.  Split the source file into smaller
  320.             pieces and try again.
  321.  
  322.     Error - Could not modify file name to be MS-DOS conformant.
  323.  
  324.         File name mungling is turned on, and the name of one of the
  325.         files cannot be made conformant (probably due to having to
  326.         many numbers in it).
  327.  
  328.     Warning - Unexpected end of file in segment:
  329.         Segment: 'segment line'
  330.  
  331.          File name mungling is turned on, and UNPOST is attempting to
  332.         identify the file type (so it can use the proper extension
  333.         when modifying the file name) but the UU begin line was the
  334.         last line in the file.
  335.  
  336.     Warning - No UU line after begin.
  337.         Segment: 'segment line'
  338.  
  339.         File name mungling is turned on, and UNPOST is attempting to
  340.         identify the file type (so it can use the proper extension
  341.         when modifying the file name) but the UU begin line was not
  342.         followed by a line of UU encoded binary data.
  343.  
  344.     Error - Got number of segments but not segment number.
  345.     Error - Got segment number but not number of segments.
  346.  
  347.         UNPOST must have all three pieces of relevant data, but if
  348.         UNPOST has at least an ID string, UNPOST will attempt to
  349.         assume a one part binary.
  350.  
  351.     Error - Could not get ID string.
  352.  
  353.         Fatal error, with no ID string, there is no way to collect
  354.         the pieces together.
  355.  
  356.     Error - No begin line in first segment:
  357.         Segment: 'segment line'
  358.  
  359.         UNPOST did not find a UU begin line in the first segment.
  360.  
  361.     Error - missing '}' in regular expression.
  362.  
  363.         In a regular expression of the type abc{1, 2}, the closing curly
  364.         brace is missing.
  365.  
  366.     Error - To many sub-expressions.
  367.  
  368.         UNPOST has a limit on the number of sub-expressions it
  369.         allows.  This is a compile time option that can be changed
  370.         by modifying the value of MAX_SUB_EXPRS in regexp.h.
  371.  
  372.     Error - missing ')' in regular expression.
  373.  
  374.         Mismatched parentheses.
  375.  
  376.     Error - badly formed regular expression.
  377.         Unexpected character 'c'
  378.  
  379.         I give up!  What is this character doing at this point in
  380.         a regular expression?
  381.  
  382.     Error, can not enumerate a sub expression.
  383.  
  384.         Regular expressions of the type: (...)* are not allowed.
  385.  
  386.     Error - illegal regular expression node type.
  387.  
  388.         Whoops, we have an internal programmers error here.  Let
  389.         me know if you see this.
  390.  
  391.     Error - Sub expression # extraction failed.
  392.  
  393.         Another internal error that needs to be brought to my attention.
  394.  
  395.     Error - could not open file 'filename' for reading.
  396.  
  397.          UNPOST could not open file 'filename' for processing.  Did you
  398.         spellit right?
  399.  
  400.     Error - Unexpected end of file.
  401.  
  402.     Error - Unexpected UU begin line.
  403.  
  404.     Error - Segment number # greater than number of segments in:
  405.         Segment: 'segment line'
  406.  
  407.         Either UNPOST got screwed up somehow or the poster posted
  408.         something like (Part 10/9).
  409.  
  410.     Warning - duplicate segment # in:
  411.         Binary ID: 'binaryID'
  412.  
  413.         UNPOST found two segments with the same binary ID and the
  414.         same segment number.
  415.  
  416.     Error - reading source file.
  417.  
  418.         Could not read a line from the source file.
  419.  
  420.     Error - Could not open file 'filename' for output.
  421.  
  422.         Could not open one of the text, incomplete or error files
  423.         for writing.
  424.  
  425. Configuration:
  426.  
  427.     Ok, here's how to configure UNPOST to work for you.  UNPOST relies
  428.     heavily on regular expressions.  These regular expressions may
  429.     not be correct for your news reader, or system.
  430.  
  431.     There are five classes of regular expressions:
  432.  
  433.     1)  The SEGMENT begin line regular expression.
  434.  
  435.     2)  The ID line prefix regular expression.
  436.  
  437.     3)  The ID line with part description regular expression list.
  438.  
  439.     4)  The begin line regular expression.
  440.  
  441.     5)  The end line regular expression.
  442.  
  443.     Of these five, I don't expect you to have to modify the regular
  444.     expressions for handling begin and end lines, because they should
  445.     be correct for all uuencoders that follow the standard format.
  446.  
  447.     Be aware that UNPOST has a hierarchy of regular expressions.
  448.     Each SEGMENT begin line regular expression has underneath it two
  449.     lists of regular expressions that recognize ID line prefixes,
  450.     and each element in the list of ID line prefix regular expressions
  451.     has a list under it that attempts to parse the ID line.
  452.  
  453.     The two lists are for 1) the header and 2) the body.
  454.  
  455.     The ID line prefix regular expression exists for the sake of
  456.     efficiency.  It is used to find an ID line before we attempt
  457.     to parse it.  Modify or add one of these if you wish to change
  458.     whether or not a line is recognized by UNPOST as being an ID line.
  459.     If you modify this, you must modify the list of segment description
  460.     regular expressions to match.
  461.  
  462.     The SEGMENT begin line regular expressions are used to find the begining
  463.      of a SEGMENT, or the end of a previous segment.  Modify these to change
  464.     the line or lines that UNPOST recognizes as the begining of a segment.
  465.  
  466.     If you get an error message that indicates that the Subject line
  467.     has no identifiable part description, and you see that some bright
  468.     boy/girl has come up with a brand new part description format, then
  469.     you have two choices, modify the source and hope they don't post
  470.     again, or add a new ID line regular expression to the list of
  471.     ID line regular expressions in the segment.c source file.
  472.  
  473.     Be aware that the lists of regular expressions are searched in order
  474.     from top to bottom to find a match.  This means that less specific
  475.     regular expressions should be placed later in the list.  For example:
  476.     the regular expression '\((0-9)+/(0-9)+\)' should come before the
  477.     regular expression '(0-9)+ (0-9)+' in the part syntax parsing regular
  478.     expression list.  This reduces the number of misparses that occur.
  479.  
  480.     Remember that C uses the backslash (\) as an escape character in
  481.     strings, so to put a backslash into a regular expression you
  482.     need to put two into the C source string.
  483.  
  484.     All regular expressions can be found at the top of the parse.c source
  485.     file.  Before you modify the actual source code and recompile, I
  486.     strongly suggest that you compile the regular expression test harness
  487.     and test your new regular expression.  Then, when you are sure that
  488.     it is correct, copy the def.cfg file to a new name, make your changes
  489.     there and use that configuration file for a while.  If after all this,
  490.     you are sure that it works, go for it.
  491.  
  492.     Before you add or modify a regular expression, you have to know the
  493.     syntax of the regular expressions used in this program.  The syntax
  494.     is very similiar to that used by UN*X style regular expressions,
  495.     but is not exactly the same.  See the section titled Regular
  496.     Expressions before attempting to configure UNPOST.
  497.  
  498. Regular Expressions:
  499.  
  500.     Operands
  501.     --------
  502.  
  503.     UNPOST regular expressions have three types of operands, character
  504.     strings (one or more characters), character sets and match any
  505.     single character.  A character string is any series of adjacent
  506.     characters that are not not meta-characters (special characters).
  507.     A data set is a string of characters enclosed in square braces with
  508.     an optional caret (^) as the first character following the open
  509.     square brace.  The match any character operand matches any single
  510.     character except the end of line character.
  511.  
  512.     A character string in a regular expression matches the exact string
  513.     in the source, including case.
  514.  
  515.     Example of character strings:
  516.  
  517.     AirPlane    - Matches the string 'AirPlane', but not the strings
  518.                   'airPlane' or 'Airplane'.
  519.  
  520.     A character set will match any single character in the source if
  521.     that character is a member of the set.  If the first character
  522.     of the set is the caret, the character set will match any
  523.     character that is NOT a member of the set (including control
  524.     characters!) except for NUL and LF.
  525.  
  526.     A character set can be described using ranges.
  527.  
  528.     Examples of character sets:
  529.  
  530.     [abcd]      - Matches either a, b, c or d.
  531.  
  532.     [0-9]       - Matches any decimal character.
  533.  
  534.     [^a-z]      - Matches any character that is not a lower
  535.                   case alphabetic.
  536.  
  537.     The match any character operand does just that, it matches any
  538.     character.  But it does not match the case of no character, NUL
  539.     or LF.
  540.  
  541.     Example of match any character:
  542.  
  543.     .       - Matches any character.
  544.  
  545.     Operators
  546.     ---------
  547.  
  548.     UNPOST regular expressions also contain operators.  The operators that
  549.     upost recognizes are the alternation operator, the span operators, the
  550.     concatenation operator and the enumeration operators.
  551.  
  552.     The alternation operator has the lowest precedence of all the operators
  553.     and its action is to attempt to match one of two alternatives.
  554.  
  555.     Example of alternation:
  556.  
  557.     Airplane|drigible   - Matches either the string Airplane or the string
  558.                           drigible.
  559.  
  560.     The next higher precedence operator is the catenation operator.  The
  561.     catenation operator specifies that both the left and right hand
  562.     regular expressions must match.  The catenation operator does not
  563.     have a special character, it is assumed to exist between two
  564.     different operands that have no other operator between them.
  565.  
  566.     Example of catenation:
  567.  
  568.     [Aa]irplane - Matches either a 'A' or an 'a' followed by the string
  569.                   irplane.  This is a catenation of the two regular
  570.                   expressions [Aa] and irplane.
  571.  
  572.     The next higher precedence operator is the enumeration operator.
  573.     The enumeration operator specifies how many instances of a regular
  574.     expression must be matched.
  575.  
  576.     Examples of Enumeration:
  577.  
  578.     abc*    - Matches zero or more occurences of the string abc.
  579.     [A-Z]+  - Matches one or more occurences of an upper case
  580.               alphabetic character.
  581.     [ ]?    - Matches zero or one occurences of the space character.
  582.     very{1} - Matches one or more occurences of the string very.
  583.     b{1,3}  - Matches a minimum of one to a maximum of three occurences
  584.               of the string b.
  585.  
  586.     An enumeration operator attempts to match the largest source sub-
  587.     string possible, except in the case of the . (match any character)
  588.     followed by an enumeration operator.  In this case, the smallest
  589.     possible sub-string is matched.
  590.  
  591.     The precedence of the operators can be modified with the use of
  592.     parentheses.  Parentheses have another meaning as well, described
  593.     below.
  594.  
  595.     Example of parenthesis use:
  596.  
  597.     Death( defying|wish)    - Will match either the string 'Death defying'
  598.                               or the string 'Deathwish'.  Without the
  599.                               parentheses, the regular expression would
  600.                               match either the string 'Death defying'
  601.                               or the string 'wish'.
  602.     Sub Expressions
  603.     ---------------
  604.  
  605.     UNPOST regular expressions are used primarily for identifying a
  606.     particular line and extracting substrings from that line.  To
  607.     this end, UNPOST regular expressions support sub-expression
  608.     marking.  Subexpressions are marked by parentheses.
  609.  
  610.     To determine the sub-expression number of a sub-expression, scan
  611.     the regular expression from left to right, counting the number
  612.     of left parentheses.  Start with one, and whatever the count for
  613.     that sub-expression, is it's subexpression number.
  614.  
  615.     Example:
  616.  
  617.     .*((abcd)((0-9)+/(0-9)+))
  618.  
  619.     Sub-expression ((abcd)((0-9)+/(0-9)+)) is sub-expression #1.
  620.     Sub-expression (abcd) is #2.  Sub-expression ((0-9)+/(0-9)+) is #3.
  621.     Sub-expression (0-9)+ is #4.  Sub-expression (0-9)+ is #5.
  622.  
  623.     Anchoring
  624.     ---------
  625.  
  626.     Normally, a regular expression will match a sub-string any where in
  627.     the source string.  If you want to specify that the matching sub-string
  628.     must start at the begining of the source string, you may use a caret
  629.     character as the first character of the regular expression.  This
  630.     anchors the regular expression match to the start of the line.
  631.  
  632.     To anchor a regular expression to the end of a line, use the dollar
  633.     sign character.  This effectively matches the end of line or end
  634.     of string character.
  635.  
  636.     Anchor operators have a higher precedence than alternation, but lower
  637.     than catenation.
  638.  
  639. Bugs:
  640.  
  641.     This program has been pretty extensively tested in interpretation mode,
  642.     and it appears to be both robust and flexible.
  643.  
  644.     Unfortunately, about once a week, somebody comes up with a new and
  645.     unusual way to encode the parts description on the Subject line.
  646.  
  647. Author:
  648.  
  649.     John W. M. Stevens  -   jstevens@csn.org
  650.