Imported Upstream version 0.63.0
[hcoop/debian/courier-authlib.git] / rfc822 / rfc822_getaddrs.c
CommitLineData
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
12static void cntlen(char c, void *p)
13{
14 c=c;
15 ++ *(size_t *)p;
16}
17
18static void cntlensep(const char *p, void *ptr)
19{
20 while (*p) cntlen(*p++, ptr);
21}
22
23static void saveaddr(char c, void *ptr)
24{
25 *(*(char **)ptr)++=c;
26}
27
28static void saveaddrsep(const char *p, void *ptr)
29{
30 while (*p) saveaddr(*p++, ptr);
31}
32
33char *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
55static void saveaddrsep_wrap(const char *p, void *ptr)
56{
57int c;
58
59 while ((c=*p++) != 0)
60 {
61 if (c == ' ') c='\n';
62 saveaddr(c, ptr);
63 }
64}
65
66char *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}