rfc822.h
上传用户:s81996212
上传日期:2007-01-04
资源大小:722k
文件大小:5k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. /*
  2. ** $Id: rfc822.h,v 1.14 2000/02/23 02:41:19 mrsam Exp $
  3. */
  4. #ifndef rfc822_h
  5. #define rfc822_h
  6. /*
  7. ** Copyright 1998 - 1999 Double Precision, Inc.
  8. ** See COPYING for distribution information.
  9. */
  10. #if HAVE_CONFIG_H
  11. #include "config.h"
  12. #endif
  13. #include <time.h>
  14. #ifdef  __cplusplus
  15. extern "C" {
  16. #endif
  17. /*
  18. ** The text string we want to parse is first tokenized into an array of
  19. ** struct rfc822token records.  'ptr' points into the original text
  20. ** string, and 'len' has how many characters from 'ptr' belongs to this
  21. ** token.
  22. */
  23. struct rfc822token {
  24. struct rfc822token *next; /* Unused by librfc822, for use by
  25. ** clients */
  26. int token;
  27. /*
  28.   Values for token:
  29.   '(' - comment
  30.   '"' - quoted string
  31.   '<', '>', '@', ',', ';', ':', '.', '[', ']', '%', '!', '=', '?', '/' - RFC atoms.
  32.   0   - atom
  33. */
  34. #define rfc822_is_atom(p) ( (p) == 0 || (p) == '"' || (p) == '(' )
  35. const char *ptr; /* Pointer to value for the token. */
  36. int len; /* Length of token value */
  37. } ;
  38. /*
  39. ** After the struct rfc822token array is built, it is used to create
  40. ** the rfc822addr array, which is the array of addresses (plus
  41. ** syntactical fluff) extracted from those text strings.  Each rfc822addr
  42. ** record has several possible interpretation:
  43. **
  44. ** tokens is NULL - syntactical fluff, look in name/nname for tokens
  45. **                  representing the syntactical fluff ( which is semicolons
  46. **                  and  list name:
  47. **
  48. ** tokens is not NULL - actual address.  The tokens representing the actual
  49. **                  address is in tokens/ntokens.  If there are comments in
  50. **                  the address that are possible "real name" for the address
  51. **                  they are saved in name/nname (name may be null if there
  52. **                  is none).
  53. **                  If nname is 1, and name points to a comment token,
  54. **                  the address was specified in old-style format.  Otherwise
  55. **                  the address was specified in new-style route-addr format.
  56. **
  57. ** The tokens and name pointers are set to point to the original rfc822token
  58. ** array.
  59. */
  60. struct rfc822addr {
  61. struct rfc822token *tokens;
  62. struct rfc822token *name;
  63. } ;
  64. /***************************************************************************
  65. **
  66. ** rfc822 tokens
  67. **
  68. ***************************************************************************/
  69. struct rfc822t {
  70. struct rfc822token *tokens;
  71. int ntokens;
  72. } ;
  73. struct rfc822t *rfc822t_alloc(const char *p,
  74. void (*err_func)(const char *, int)); /* Parse addresses */
  75. void rfc822t_free(struct rfc822t *); /* Free rfc822 structure */
  76. void rfc822tok_print(const struct rfc822token *, void (*)(char, void *), void *);
  77. /* Print the tokens */
  78. /***************************************************************************
  79. **
  80. ** rfc822 addresses
  81. **
  82. ***************************************************************************/
  83. struct rfc822a {
  84. struct rfc822addr *addrs;
  85. int naddrs;
  86. } ;
  87. struct rfc822a *rfc822a_alloc(struct rfc822t *);
  88. void rfc822a_free(struct rfc822a *); /* Free rfc822 structure */
  89. void rfc822_deladdr(struct rfc822a *, int);
  90. /* rfc822_print "unparses" the rfc822 structure.  Each rfc822addr is "printed"
  91.    (via the attached function).  NOTE: instead of separating addresses by
  92.    commas, the print_separator function is called.
  93. */
  94. void rfc822_print(const struct rfc822a *a,
  95. void (*print_func)(char, void *),
  96. void (*print_separator)(const char *, void *), void *);
  97. /* rfc822_print_common is an internal function */
  98. void rfc822_print_common(const struct rfc822a *a,
  99. char *(*decode_func)(const char *, const char *),
  100. const char *chset,
  101. void (*print_func)(char, void *),
  102. void (*print_separator)(const char *, void *), void *);
  103. /* Another unparser, except that only the raw addresses are extracted,
  104.    and each address is followed by a newline character */
  105. void rfc822_addrlist(const struct rfc822a *, void (*print_func)(char, void *),
  106. void *);
  107. /* Now, just the comments.  If comments not given, the address. */
  108. void rfc822_namelist(const struct rfc822a *, void (*print_func)(char, void *),
  109. void *);
  110. /* Unparse an individual name/addr from a list of addresses.  If the given
  111.    index points to some syntactical fluff, this is a noop */
  112. void rfc822_prname(const struct rfc822a *, int, void (*)(char, void *), void *);
  113. void rfc822_praddr(const struct rfc822a *, int, void (*)(char, void *), void *);
  114. /* Extra functions */
  115. char *rfc822_gettok(const struct rfc822token *);
  116. char *rfc822_getaddr(const struct rfc822a *, int);
  117. char *rfc822_getname(const struct rfc822a *, int);
  118. char *rfc822_getaddrs(const struct rfc822a *);
  119. char *rfc822_getaddrs_wrap(const struct rfc822a *, int);
  120. void rfc822_mkdate_buf(time_t, char *);
  121. const char *rfc822_mkdate(time_t);
  122. #ifdef  __cplusplus
  123. }
  124. #endif
  125. #endif