Imported Upstream version 0.63.0
[hcoop/debian/courier-authlib.git] / rfc822 / rfc822_getaddrs.c
1 /*
2 ** Copyright 1998 - 2009 Double Precision, Inc.
3 ** See COPYING for distribution information.
4 */
5
6 /*
7 ** $Id: rfc822_getaddrs.c,v 1.6 2009/11/08 18:14:47 mrsam Exp $
8 */
9 #include "rfc822.h"
10 #include <stdlib.h>
11
12 static void cntlen(char c, void *p)
13 {
14 c=c;
15 ++ *(size_t *)p;
16 }
17
18 static void cntlensep(const char *p, void *ptr)
19 {
20 while (*p) cntlen(*p++, ptr);
21 }
22
23 static void saveaddr(char c, void *ptr)
24 {
25 *(*(char **)ptr)++=c;
26 }
27
28 static void saveaddrsep(const char *p, void *ptr)
29 {
30 while (*p) saveaddr(*p++, ptr);
31 }
32
33 char *rfc822_getaddrs(const struct rfc822a *rfc)
34 {
35 size_t addrbuflen=0;
36 char *addrbuf, *ptr;
37
38 if (rfc822_print(rfc, &cntlen, &cntlensep, &addrbuflen) < 0)
39 return NULL;
40
41 if (!(addrbuf=malloc(addrbuflen+1)))
42 return (0);
43
44 ptr=addrbuf;
45 if (rfc822_print(rfc, &saveaddr, &saveaddrsep, &ptr) < 0)
46 {
47 free(addrbuf);
48 return NULL;
49 }
50
51 addrbuf[addrbuflen]=0;
52 return (addrbuf);
53 }
54
55 static void saveaddrsep_wrap(const char *p, void *ptr)
56 {
57 int c;
58
59 while ((c=*p++) != 0)
60 {
61 if (c == ' ') c='\n';
62 saveaddr(c, ptr);
63 }
64 }
65
66 char *rfc822_getaddrs_wrap(const struct rfc822a *rfc, int w)
67 {
68 size_t addrbuflen=0;
69 char *addrbuf, *ptr, *start, *lastnl;
70
71 if (rfc822_print(rfc, &cntlen, &cntlensep, &addrbuflen) < 0)
72 return NULL;
73
74 if (!(addrbuf=malloc(addrbuflen+1)))
75 return (0);
76
77 ptr=addrbuf;
78
79 if (rfc822_print(rfc, &saveaddr, &saveaddrsep_wrap, &ptr) < 0)
80 {
81 free(addrbuf);
82 return NULL;
83 }
84
85 addrbuf[addrbuflen]=0;
86
87 for (lastnl=0, start=ptr=addrbuf; *ptr; )
88 {
89 while (*ptr && *ptr != '\n') ptr++;
90 if (ptr-start < w)
91 {
92 if (lastnl) *lastnl=' ';
93 lastnl=ptr;
94 if (*ptr) ++ptr;
95 }
96 else
97 {
98 if (lastnl)
99 start=lastnl+1;
100 else
101 {
102 start=ptr+1;
103 if (*ptr) ++ptr;
104 }
105 lastnl=0;
106 }
107 }
108 return (addrbuf);
109 }