Back to index

courier  0.68.2
rfc822_getaddrs.c
Go to the documentation of this file.
00001 /*
00002 ** Copyright 1998 - 2009 Double Precision, Inc.
00003 ** See COPYING for distribution information.
00004 */
00005 
00006 /*
00007 */
00008 #include      "rfc822.h"
00009 #include      <stdlib.h>
00010 
00011 static void cntlen(char c, void *p)
00012 {
00013        c=c;
00014        ++ *(size_t *)p;
00015 }
00016 
00017 static void cntlensep(const char *p, void *ptr)
00018 {
00019        while (*p)    cntlen(*p++, ptr);
00020 }
00021 
00022 static void saveaddr(char c, void *ptr)
00023 {
00024        *(*(char **)ptr)++=c;
00025 }
00026 
00027 static void saveaddrsep(const char *p, void *ptr)
00028 {
00029        while (*p)    saveaddr(*p++, ptr);
00030 }
00031 
00032 char *rfc822_getaddrs(const struct rfc822a *rfc)
00033 {
00034        size_t addrbuflen=0;
00035        char   *addrbuf, *ptr;
00036 
00037        if (rfc822_print(rfc, &cntlen, &cntlensep, &addrbuflen) < 0)
00038               return NULL;
00039 
00040        if (!(addrbuf=malloc(addrbuflen+1)))
00041               return (0);
00042 
00043        ptr=addrbuf;
00044        if (rfc822_print(rfc, &saveaddr, &saveaddrsep, &ptr) < 0)
00045        {
00046               free(addrbuf);
00047               return NULL;
00048        }
00049 
00050        addrbuf[addrbuflen]=0;
00051        return (addrbuf);
00052 }
00053 
00054 static void saveaddrsep_wrap(const char *p, void *ptr)
00055 {
00056 int    c;
00057 
00058        while ((c=*p++) != 0)
00059        {
00060               if (c == ' ') c='\n';
00061               saveaddr(c, ptr);
00062        }
00063 }
00064 
00065 char *rfc822_getaddrs_wrap(const struct rfc822a *rfc, int w)
00066 {
00067        size_t addrbuflen=0;
00068        char   *addrbuf, *ptr, *start, *lastnl;
00069 
00070        if (rfc822_print(rfc, &cntlen, &cntlensep, &addrbuflen) < 0)
00071               return NULL;
00072 
00073        if (!(addrbuf=malloc(addrbuflen+1)))
00074               return (0);
00075 
00076        ptr=addrbuf;
00077 
00078        if (rfc822_print(rfc, &saveaddr, &saveaddrsep_wrap, &ptr) < 0)
00079        {
00080               free(addrbuf);
00081               return NULL;
00082        }
00083 
00084        addrbuf[addrbuflen]=0;
00085 
00086        for (lastnl=0, start=ptr=addrbuf; *ptr; )
00087        {
00088               while (*ptr && *ptr != '\n')       ptr++;
00089               if (ptr-start < w)
00090               {
00091                      if (lastnl)   *lastnl=' ';
00092                      lastnl=ptr;
00093                      if (*ptr)     ++ptr;
00094               }
00095               else
00096               {
00097                      if (lastnl)
00098                             start=lastnl+1;
00099                      else
00100                      {
00101                             start=ptr+1;
00102                             if (*ptr)     ++ptr;
00103                      }
00104                      lastnl=0;
00105               }
00106        }
00107        return (addrbuf);
00108 }