Added m_getfld () interface description.
authorDavid Levine <levinedl@acm.org>
Sat, 22 Dec 2012 15:51:25 +0000 (09:51 -0600)
committerDavid Levine <levinedl@acm.org>
Sat, 22 Dec 2012 15:54:08 +0000 (09:54 -0600)
sbr/m_getfld.c

index e139505..fe88dc7 100644 (file)
    there is data in "name" or "buf").
   */
 
+/*
+Purpose
+=======
+Reads an Internet message (RFC 5322), or one or more messages stored in a
+maildrop in mbox (RFC 4155) or MMDF format, from a file stream.  Each call
+to m_getfld() reads one header field, or a portion of the body, in sequence.
+
+Inputs
+======
+state:  message parse state
+bufsz:  maximum number of characters to load into buf
+iob:  input file stream
+
+Outputs
+=======
+name:  header field name (array of size NAMESZ=999)
+buf:  either a header field body or message body
+(return value):  message parse state on return from function
+(global) int msg_count:  number of characters loaded into buf
+
+Functions (part of Inputs, really)
+=========
+void m_unknown(FILE *iob):  Determines the message delimiter string for the
+  maildrop.  Called by inc, scan, and msh when reading from a maildrop file.
+
+void m_eomsbr (int (*action)(int)):  Sets the hook to check for end of
+  message in a maildrop.  Called only by msh.
+
+Those functions save state in the State variables listed below.
+
+Definitions
+===========
+state is one of:
+  FLD      // Field returned
+  FLDPLUS  // Field returned with more to come
+  FLDEOF   // Field returned ending at eom
+  BODY     // Body  returned with more to come
+  BODYEOF  // Body  returned ending at eom
+  FILEEOF  // Reached end of input file
+  FMTERR   // Message Format error
+  LENERR   // Name too long error from getfld
+
+msg_style is maildrop style, one of:
+  MS_UNKNOWN // type not known yet
+  MS_DEFAULT // default (one msg per file)
+  MS_MBOX    // Unix-style "from" lines
+  MS_MMDF    // string mmdlm2
+  MS_MSH     // whacko msh
+
+State variables (part of Outputs)
+===============
+m_getfld() retains state internally between calls in some state variables.
+
+These two variables are global, but only used internally by m_getfld.c:
+int msg_style
+char *msg_delim
+
+These are used for the end-of-message matcher when reading maildrops:
+static unsigned char **pat_map
+static unsigned char *fdelim
+static unsigned char *delimend
+static int fdelimlen
+static unsigned char *edelim
+static int edelimlen
+
+Restriction
+===========
+m_getfld() is restricted to operate on one file stream at a time because of
+the retained state (see "State variables" above).
+
+Current usage
+=============
+The first call to m_getfld() on a file stream is with a state of FLD.
+Subsequent calls provide the state returned by the previous call.
+
+Along the way, I thought of these possible interface changes that we
+might want to consider before rototilling the internals:
+
+1) To improve interface documentation:
+   Change type of name argument from unsigned char * to unsigned char[NAMESZ].
+   This would also be a step toward allowing the compiler to check for array
+   size consistency.
+
+2) To remove globals that don't need to be:
+   Change msg_style and msg_delim to be file static.
+
+3) To remove a global:
+   Change bufsz to be in-out instead of in, and therefore int * instead of
+   int, and use that instead of global msg_count.  There are only 3 call
+   sites that use msg_count so it wouldn't take much effort to remove use of
+   it.  Of course, all call sites would have to change to provide an int *
+   instead of an int.  Some now pass constants.
+
+4) To remove the state argument from the signature:
+   Given the Current usage and Restriction above, the state variable could
+   be removed from the signature and just retained internally.
+
+5) To remove the Restriction above:
+   One approach would be for m_getfld() to retain multiple copies of that
+   state, one per iob that it sees.  Another approach would be for the
+   caller to store it in an opaque struct, the address of which is passed
+   through the interface.
+*/
 
 /*
  * static prototypes