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

WEB邮件程序

开发平台:

C/C++

  1. /*
  2. ** Copyright 1998 - 1999 Double Precision, Inc.
  3. ** See COPYING for distribution information.
  4. */
  5. /*
  6. ** $Id: rfc822_getaddrs.c,v 1.5 1999/12/06 13:29:49 mrsam Exp $
  7. */
  8. #include "rfc822.h"
  9. #include <stdlib.h>
  10. static void cntlen(char c, void *p)
  11. {
  12. c=c;
  13. ++ *(size_t *)p;
  14. }
  15. static void cntlensep(const char *p, void *ptr)
  16. {
  17. while (*p) cntlen(*p++, ptr);
  18. }
  19. static void saveaddr(char c, void *ptr)
  20. {
  21. *(*(char **)ptr)++=c;
  22. }
  23. static void saveaddrsep(const char *p, void *ptr)
  24. {
  25. while (*p) saveaddr(*p++, ptr);
  26. }
  27. char *rfc822_getaddrs(const struct rfc822a *rfc)
  28. {
  29. size_t addrbuflen=0;
  30. char *addrbuf, *ptr;
  31. rfc822_print(rfc, &cntlen, &cntlensep, &addrbuflen);
  32. if (!(addrbuf=malloc(addrbuflen+1)))
  33. return (0);
  34. ptr=addrbuf;
  35. rfc822_print(rfc, &saveaddr, &saveaddrsep, &ptr);
  36. addrbuf[addrbuflen]=0;
  37. return (addrbuf);
  38. }
  39. static void saveaddrsep_wrap(const char *p, void *ptr)
  40. {
  41. int c;
  42. while ((c=*p++) != 0)
  43. {
  44. if (c == ' ') c='n';
  45. saveaddr(c, ptr);
  46. }
  47. }
  48. char *rfc822_getaddrs_wrap(const struct rfc822a *rfc, int w)
  49. {
  50. size_t addrbuflen=0;
  51. char *addrbuf, *ptr, *start, *lastnl;
  52. rfc822_print(rfc, &cntlen, &cntlensep, &addrbuflen);
  53. if (!(addrbuf=malloc(addrbuflen+1)))
  54. return (0);
  55. ptr=addrbuf;
  56. rfc822_print(rfc, &saveaddr, &saveaddrsep_wrap, &ptr);
  57. addrbuf[addrbuflen]=0;
  58. for (lastnl=0, start=ptr=addrbuf; *ptr; )
  59. {
  60. while (*ptr && *ptr != 'n') ptr++;
  61. if (ptr-start < w)
  62. {
  63. if (lastnl) *lastnl=' ';
  64. lastnl=ptr;
  65. if (*ptr) ++ptr;
  66. }
  67. else
  68. {
  69. if (lastnl)
  70. start=lastnl+1;
  71. else
  72. {
  73. start=ptr+1;
  74. if (*ptr) ++ptr;
  75. }
  76. lastnl=0;
  77. }
  78. }
  79. return (addrbuf);
  80. }