Commit | Line | Data |
---|---|---|
d9898ee8 | 1 | /* |
8d138742 | 2 | ** Copyright 1998 - 2009 Double Precision, Inc. |
d9898ee8 | 3 | ** See COPYING for distribution information. |
4 | */ | |
5 | ||
6 | /* | |
8d138742 | 7 | ** $Id: rfc822_getaddrs.c,v 1.6 2009/11/08 18:14:47 mrsam Exp $ |
d9898ee8 | 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 | { | |
8d138742 CE |
35 | size_t addrbuflen=0; |
36 | char *addrbuf, *ptr; | |
37 | ||
38 | if (rfc822_print(rfc, &cntlen, &cntlensep, &addrbuflen) < 0) | |
39 | return NULL; | |
d9898ee8 | 40 | |
d9898ee8 | 41 | if (!(addrbuf=malloc(addrbuflen+1))) |
42 | return (0); | |
43 | ||
44 | ptr=addrbuf; | |
8d138742 CE |
45 | if (rfc822_print(rfc, &saveaddr, &saveaddrsep, &ptr) < 0) |
46 | { | |
47 | free(addrbuf); | |
48 | return NULL; | |
49 | } | |
50 | ||
d9898ee8 | 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 | { | |
8d138742 CE |
68 | size_t addrbuflen=0; |
69 | char *addrbuf, *ptr, *start, *lastnl; | |
70 | ||
71 | if (rfc822_print(rfc, &cntlen, &cntlensep, &addrbuflen) < 0) | |
72 | return NULL; | |
d9898ee8 | 73 | |
d9898ee8 | 74 | if (!(addrbuf=malloc(addrbuflen+1))) |
75 | return (0); | |
76 | ||
77 | ptr=addrbuf; | |
8d138742 CE |
78 | |
79 | if (rfc822_print(rfc, &saveaddr, &saveaddrsep_wrap, &ptr) < 0) | |
80 | { | |
81 | free(addrbuf); | |
82 | return NULL; | |
83 | } | |
84 | ||
d9898ee8 | 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 | } |