d9898ee8 |
1 | /* |
2 | ** Copyright 1998 - 1999 Double Precision, Inc. |
3 | ** See COPYING for distribution information. |
4 | */ |
5 | |
6 | /* |
7 | ** $Id: rfc822_getaddrs.c,v 1.5 1999/12/06 13:29:49 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 | rfc822_print(rfc, &cntlen, &cntlensep, &addrbuflen); |
39 | if (!(addrbuf=malloc(addrbuflen+1))) |
40 | return (0); |
41 | |
42 | ptr=addrbuf; |
43 | rfc822_print(rfc, &saveaddr, &saveaddrsep, &ptr); |
44 | addrbuf[addrbuflen]=0; |
45 | return (addrbuf); |
46 | } |
47 | |
48 | static void saveaddrsep_wrap(const char *p, void *ptr) |
49 | { |
50 | int c; |
51 | |
52 | while ((c=*p++) != 0) |
53 | { |
54 | if (c == ' ') c='\n'; |
55 | saveaddr(c, ptr); |
56 | } |
57 | } |
58 | |
59 | char *rfc822_getaddrs_wrap(const struct rfc822a *rfc, int w) |
60 | { |
61 | size_t addrbuflen=0; |
62 | char *addrbuf, *ptr, *start, *lastnl; |
63 | |
64 | rfc822_print(rfc, &cntlen, &cntlensep, &addrbuflen); |
65 | if (!(addrbuf=malloc(addrbuflen+1))) |
66 | return (0); |
67 | |
68 | ptr=addrbuf; |
69 | rfc822_print(rfc, &saveaddr, &saveaddrsep_wrap, &ptr); |
70 | addrbuf[addrbuflen]=0; |
71 | |
72 | for (lastnl=0, start=ptr=addrbuf; *ptr; ) |
73 | { |
74 | while (*ptr && *ptr != '\n') ptr++; |
75 | if (ptr-start < w) |
76 | { |
77 | if (lastnl) *lastnl=' '; |
78 | lastnl=ptr; |
79 | if (*ptr) ++ptr; |
80 | } |
81 | else |
82 | { |
83 | if (lastnl) |
84 | start=lastnl+1; |
85 | else |
86 | { |
87 | start=ptr+1; |
88 | if (*ptr) ++ptr; |
89 | } |
90 | lastnl=0; |
91 | } |
92 | } |
93 | return (addrbuf); |
94 | } |