171 lines
5.0 KiB
C
171 lines
5.0 KiB
C
|
/*
|
||
|
** $Id$
|
||
|
*/
|
||
|
#ifndef rfc822_h
|
||
|
#define rfc822_h
|
||
|
|
||
|
/*
|
||
|
** Copyright 1998 - 2000 Double Precision, Inc.
|
||
|
** See COPYING for distribution information.
|
||
|
*/
|
||
|
|
||
|
#if HAVE_CONFIG_H
|
||
|
#include "config.h"
|
||
|
#endif
|
||
|
|
||
|
#include <time.h>
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
/*
|
||
|
** 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(const char *p,
|
||
|
void (*err_func)(const char *, int)); /* 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.
|
||
|
*/
|
||
|
|
||
|
void 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 */
|
||
|
|
||
|
void rfc822_print_common(const struct rfc822a *a,
|
||
|
char *(*decode_func)(const char *, const char *),
|
||
|
const char *chset,
|
||
|
void (*print_func)(char, void *),
|
||
|
void (*print_separator)(const char *, void *), void *);
|
||
|
|
||
|
/* Another unparser, except that only the raw addresses are extracted,
|
||
|
and each address is followed by a newline character */
|
||
|
|
||
|
void rfc822_addrlist(const struct rfc822a *, void (*print_func)(char, void *),
|
||
|
void *);
|
||
|
|
||
|
/* Now, just the comments. If comments not given, the address. */
|
||
|
void rfc822_namelist(const struct rfc822a *, void (*print_func)(char, void *),
|
||
|
void *);
|
||
|
|
||
|
/* Unparse an individual name/addr from a list of addresses. If the given
|
||
|
index points to some syntactical fluff, this is a noop */
|
||
|
|
||
|
void rfc822_prname(const struct rfc822a *, int, void (*)(char, void *), void *);
|
||
|
void rfc822_praddr(const struct rfc822a *, int, void (*)(char, void *), void *);
|
||
|
|
||
|
/* Like rfc822_prname, except that we'll also print the legacy format
|
||
|
** of a list designation.
|
||
|
*/
|
||
|
|
||
|
void rfc822_prname_orlist(const struct rfc822a *, int,
|
||
|
void (*)(char, void *), void *);
|
||
|
|
||
|
/* Extra functions */
|
||
|
|
||
|
char *rfc822_gettok(const struct rfc822token *);
|
||
|
char *rfc822_getaddr(const struct rfc822a *, int);
|
||
|
char *rfc822_getname(const struct rfc822a *, int);
|
||
|
char *rfc822_getname_orlist(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 *);
|
||
|
|
||
|
char *rfc822_coresubj(const char *, int *);
|
||
|
char *rfc822_coresubj_nouc(const char *, int *);
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif
|