diff options
| author | Sam Varshavchik | 2013-08-19 16:39:41 -0400 |
|---|---|---|
| committer | Sam Varshavchik | 2013-08-25 14:43:51 -0400 |
| commit | 9c45d9ad13fdf439d44d7443ae75da15ea0223ed (patch) | |
| tree | 7a81a04cb51efb078ee350859a64be2ebc6b8813 /rfc822/rfc822.h | |
| parent | a9520698b770168d1f33d6301463bb70a19655ec (diff) | |
| download | courier-libs-9c45d9ad13fdf439d44d7443ae75da15ea0223ed.tar.bz2 | |
Initial checkin
Imported from subversion report, converted to git. Updated all paths in
scripts and makefiles, reflecting the new directory hierarchy.
Diffstat (limited to 'rfc822/rfc822.h')
| -rw-r--r-- | rfc822/rfc822.h | 296 |
1 files changed, 296 insertions, 0 deletions
diff --git a/rfc822/rfc822.h b/rfc822/rfc822.h new file mode 100644 index 0000000..3d437e3 --- /dev/null +++ b/rfc822/rfc822.h @@ -0,0 +1,296 @@ +/* +*/ +#ifndef rfc822_h +#define rfc822_h + +/* +** Copyright 1998 - 2009 Double Precision, Inc. +** See COPYING for distribution information. +*/ + +#if HAVE_CONFIG_H +#include "rfc822/config.h" +#endif + +#include <time.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#define RFC822_SPECIALS "()<>[]:;@\\,.\"" + +/* +** The text string we want to parse is first tokenized into an array of +** struct rfc822token records. 'ptr' points into the original text +** string, and 'len' has how many characters from 'ptr' belongs to this +** token. +*/ + +struct rfc822token { + struct rfc822token *next; /* Unused by librfc822, for use by + ** clients */ + int token; +/* + Values for token: + + '(' - comment + '"' - quoted string + '<', '>', '@', ',', ';', ':', '.', '[', ']', '%', '!', '=', '?', '/' - RFC atoms. + 0 - atom +*/ + +#define rfc822_is_atom(p) ( (p) == 0 || (p) == '"' || (p) == '(' ) + + const char *ptr; /* Pointer to value for the token. */ + int len; /* Length of token value */ +} ; + +/* +** After the struct rfc822token array is built, it is used to create +** the rfc822addr array, which is the array of addresses (plus +** syntactical fluff) extracted from those text strings. Each rfc822addr +** record has several possible interpretation: +** +** tokens is NULL - syntactical fluff, look in name/nname for tokens +** representing the syntactical fluff ( which is semicolons +** and list name: +** +** tokens is not NULL - actual address. The tokens representing the actual +** address is in tokens/ntokens. If there are comments in +** the address that are possible "real name" for the address +** they are saved in name/nname (name may be null if there +** is none). +** If nname is 1, and name points to a comment token, +** the address was specified in old-style format. Otherwise +** the address was specified in new-style route-addr format. +** +** The tokens and name pointers are set to point to the original rfc822token +** array. +*/ + +struct rfc822addr { + struct rfc822token *tokens; + struct rfc822token *name; +} ; + +/*************************************************************************** +** +** rfc822 tokens +** +***************************************************************************/ + +struct rfc822t { + struct rfc822token *tokens; + int ntokens; +} ; + +struct rfc822t *rfc822t_alloc_new(const char *p, + void (*err_func)(const char *, int, void *), void *); + /* Parse addresses */ + +void rfc822t_free(struct rfc822t *); /* Free rfc822 structure */ + +void rfc822tok_print(const struct rfc822token *, void (*)(char, void *), void *); + /* Print the tokens */ + +/*************************************************************************** +** +** rfc822 addresses +** +***************************************************************************/ + +struct rfc822a { + struct rfc822addr *addrs; + int naddrs; +} ; + +struct rfc822a *rfc822a_alloc(struct rfc822t *); +void rfc822a_free(struct rfc822a *); /* Free rfc822 structure */ + +void rfc822_deladdr(struct rfc822a *, int); + +/* rfc822_print "unparses" the rfc822 structure. Each rfc822addr is "printed" + (via the attached function). NOTE: instead of separating addresses by + commas, the print_separator function is called. +*/ + +int rfc822_print(const struct rfc822a *a, + void (*print_func)(char, void *), + void (*print_separator)(const char *, void *), void *); + +/* rfc822_print_common is an internal function */ + +int rfc822_print_common(const struct rfc822a *a, + char *(*decode_func)(const char *, const char *, int), + const char *chset, + void (*print_func)(char, void *), + void (*print_separator)(const char *, void *), void *); + +/* Extra functions */ + +char *rfc822_gettok(const struct rfc822token *); +char *rfc822_getaddr(const struct rfc822a *, int); +char *rfc822_getaddrs(const struct rfc822a *); +char *rfc822_getaddrs_wrap(const struct rfc822a *, int); + +void rfc822_mkdate_buf(time_t, char *); +const char *rfc822_mkdate(time_t); +time_t rfc822_parsedt(const char *); + +#define CORESUBJ_RE 1 +#define CORESUBJ_FWD 2 + +char *rfc822_coresubj(const char *, int *); +char *rfc822_coresubj_nouc(const char *, int *); +char *rfc822_coresubj_keepblobs(const char *s); + +/* +** Display a header. Takes a raw header value, and formats it for display +** in the given character set. +** +** hdrname -- header name. Determines whether the header contains addresses, +** or unstructured data. +** +** hdrvalue -- the actual value to format. +** +** display_func -- output function. +** +** err_func -- if this function returns a negative value, to indicate an error, +** this may be called just prior to the error return to indicate where the +** formatting error is, in the original header. +** +** ptr -- passthrough last argument to display_func or err_func. +** +** repeatedly invokes display_func to pass the formatted contents. +** +** Returns 0 upon success, -1 upon a failure. +*/ + +int rfc822_display_hdrvalue(const char *hdrname, + const char *hdrvalue, + const char *charset, + void (*display_func)(const char *, size_t, + void *), + void (*err_func)(const char *, int, void *), + void *ptr); + +/* +** Like rfc822_display_hdrvalue, except that the converted header is saved in +** a malloc-ed buffer. The pointer to the malloc-ed buffer is returned, the +** caller is responsible for free-ing it. An error condition is indicated +** by a NULL return value. +*/ + +char *rfc822_display_hdrvalue_tobuf(const char *hdrname, + const char *hdrvalue, + const char *charset, + void (*err_func)(const char *, int, + void *), + void *ptr); + +/* +** Display a recipient's name in a specific character set. +** +** The index-th recipient in the address structure is formatted for the given +** character set. If the index-th entry in the address structure is not +** a recipient address (it represents an obsolete list name indicator), +** this function reproduces it literally. +** +** If the index-th entry in the address structure is a recipient address without +** a name, the address itself is formatted for the given character set. +** +** If 'charset' is NULL, the name is formatted as is, without converting +** it to any character set. +** +** A callback function gets repeatedly invoked to produce the name. +** +** Returns a negative value upon a formatting error. +*/ + +int rfc822_display_name(const struct rfc822a *rfcp, int index, + const char *chset, + void (*print_func)(const char *, size_t, void *), + void *ptr); + +/* +** Display a recipient's name in a specific character set. +** +** Uses rfc822_display_name to place the generated name into a malloc-ed +** buffer. The caller must free it when it is no longer needed. +** +** Returns NULL upon an error. +*/ + +char *rfc822_display_name_tobuf(const struct rfc822a *rfcp, int index, + const char *chset); + +/* +** Display names of all addresses. Each name is followed by a newline +** character. +** +*/ +int rfc822_display_namelist(const struct rfc822a *rfcp, + const char *chset, + void (*print_func)(const char *, size_t, void *), + void *ptr); + +/* +** Display a recipient's address in a specific character set. +** +** The index-th recipient in the address structure is formatted for the given +** character set. If the index-th entry in the address structure is not +** a recipient address (it represents an obsolete list name indicator), +** this function produces an empty string. +** +** If 'charset' is NULL, the address is formatted as is, without converting +** it to any character set. +** +** A callback function gets repeatedly invoked to produce the address. +** +** Returns a negative value upon a formatting error. +*/ + +int rfc822_display_addr(const struct rfc822a *rfcp, int index, + const char *chset, + void (*print_func)(const char *, size_t, void *), + void *ptr); + +/* +** Like rfc822_display_addr, but the resulting displayable string is +** saved in a buffer. Returns a malloc-ed buffer, the caller is responsible +** for free()ing it. A NULL return indicates an error. +*/ + +char *rfc822_display_addr_tobuf(const struct rfc822a *rfcp, int index, + const char *chset); + +/* +** Like rfc822_display_addr, but the user@domain gets supplied in a string. +*/ +int rfc822_display_addr_str(const char *tok, + const char *chset, + void (*print_func)(const char *, size_t, void *), + void *ptr); + +/* +** Like rfc822_display_addr_str, but the resulting displayable string is +** saved in a buffer. Returns a malloc-ed buffer, the caller is responsible +** for free()ing it. A NULL return indicates an error. +*/ +char *rfc822_display_addr_str_tobuf(const char *tok, + const char *chset); + +/* +** address is a hostname, which is IDN-encoded. 'address' may contain an +** optional 'user@', which is preserved. Returns a malloc-ed buffer, the +** caller is responsible for freeing it. +*/ +char *rfc822_encode_domain(const char *address, + const char *charset); + +#ifdef __cplusplus +} +#endif + +#endif |
