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
							 |