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

WEB邮件程序

开发平台:

C/C++

  1. /*
  2. ** Copyright 1998 - 1999 Double Precision, Inc.  See COPYING for
  3. ** distribution information.
  4. */
  5. #include "rfc2045.h"
  6. #include <ctype.h>
  7. #include <string.h>
  8. /* $Id: rfc2045acprep.c,v 1.2 1999/12/06 13:29:02 mrsam Exp $ */
  9. static void start_rwprep(struct rfc2045 *);
  10. static void do_rwprep(const char *, size_t);
  11. static void end_rwprep();
  12. static struct rfc2045ac rfc2045acprep={
  13. &start_rwprep,
  14. &do_rwprep,
  15. &end_rwprep};
  16. static struct rfc2045 *currwp;
  17. static int curlinepos=0;
  18. typedef enum {
  19. raw,
  20. quotedprint,
  21. qpseeneq,
  22. qpseeneqh,
  23. base64} state_t;
  24. static state_t curstate;
  25. static int statechar;
  26. #define h2nyb(c) ( (c) >= 'a' && (c) <= 'f' ? (c)-('a'-10): 
  27.    (c) >= 'A' && (c) <= 'F' ? (c)-('A'-10): (c)-'0')
  28. struct rfc2045 *rfc2045_alloc_ac()
  29. {
  30. struct rfc2045 *p=rfc2045_alloc();
  31. if (p) p->rfc2045acptr= &rfc2045acprep;
  32. currwp=0;
  33. return (p);
  34. }
  35. static void start_rwprep(struct rfc2045 *p)
  36. {
  37. currwp=p;
  38. curlinepos=0;
  39. curstate=raw;
  40. if (p->content_transfer_encoding)
  41. {
  42. if (strcmp(p->content_transfer_encoding,
  43. "quoted-printable") == 0)
  44. curstate=quotedprint;
  45. else if (strcmp(p->content_transfer_encoding, "base64") == 0)
  46. curstate=base64;
  47. }
  48. }
  49. static void do_rwprep(const char * p, size_t n)
  50. {
  51. if (!currwp) return;
  52. for ( ; n; --n, ++p)
  53. switch (curstate) {
  54. case quotedprint:
  55. if (*p == '=')
  56. {
  57. curstate=qpseeneq;
  58. continue;
  59. }
  60. /* FALLTHRU */
  61. case raw:
  62. if (*p == 'r' || *p == 'n')
  63. curlinepos=0;
  64. else if (++curlinepos > 500)
  65. currwp->haslongline=1;
  66. if ((unsigned char)*p >= 127)
  67. currwp->has8bitchars=1;
  68. break;
  69. case qpseeneq:
  70. if (*p == 'n')
  71. {
  72. curstate=quotedprint;
  73. continue;
  74. }
  75. if (isspace((int)(unsigned char)*p)) continue; /* Ignore WSP */
  76. statechar=*p;
  77. curstate=qpseeneqh;
  78. continue;
  79. case qpseeneqh:
  80. curstate=quotedprint;
  81. if ( (unsigned char)
  82. ( (h2nyb(statechar) << 4) + h2nyb(*p) ) >= 127
  83. ) currwp->has8bitchars=1;
  84. if (++curlinepos > 500)
  85. currwp->haslongline=1;
  86. continue;
  87. case base64:
  88. break;
  89. }
  90. }
  91. static void end_rwprep()
  92. {
  93. }