Imported upstream version 0.61.0
[hcoop/debian/courier-authlib.git] / rfc822 / rfc822_getaddr.c
CommitLineData
d9898ee8 1/*
ac40fd9e 2** Copyright 1998 - 2008 Double Precision, Inc.
d9898ee8 3** See COPYING for distribution information.
4*/
5
6/*
ac40fd9e 7** $Id: rfc822_getaddr.c,v 1.8 2008/06/14 14:12:50 mrsam Exp $
d9898ee8 8*/
9#include "rfc822.h"
10#include <stdlib.h>
11
12static void cntlen(char c, void *p)
13{
14 if (c != '\n')
15 ++ *(size_t *)p;
16}
17
18static void saveaddr(char c, void *p)
19{
20 if (c != '\n')
21 {
22 char **cp=(char **)p;
23
24 *(*cp)++=c;
25 }
26}
27
28char *rfc822_getaddr(const struct rfc822a *rfc, int n)
29{
30size_t addrbuflen=0;
31char *addrbuf, *ptr;
32
33 rfc822_praddr(rfc, n, &cntlen, &addrbuflen);
34 if (!(addrbuf=malloc(addrbuflen+1)))
35 return (0);
36
37 ptr=addrbuf;
38 rfc822_praddr(rfc, n, &saveaddr, &ptr);
39 addrbuf[addrbuflen]=0;
40 return (addrbuf);
41}
42
ac40fd9e 43/* Get rid of surrounding quotes */
44
45static void dropquotes(char *addrbuf)
46{
47 char *p, *q;
48
49 p=q=addrbuf;
50
51 if (*p == '"')
52 ++p;
53
54 while (*p)
55 {
56 if (*p == '"' && p[1] == 0)
57 break;
58
59 *q++ = *p++;
60 }
61
62 *q=0;
63}
64
d9898ee8 65char *rfc822_getname(const struct rfc822a *rfc, int n)
66{
d9898ee8 67size_t addrbuflen=0;
68char *addrbuf, *ptr;
69
70 rfc822_prname(rfc, n, &cntlen, &addrbuflen);
71 if (!(addrbuf=malloc(addrbuflen+1)))
72 return (0);
73
74 ptr=addrbuf;
75 rfc822_prname(rfc, n, &saveaddr, &ptr);
76 addrbuf[addrbuflen]=0;
77
ac40fd9e 78 dropquotes(addrbuf);
d9898ee8 79 return (addrbuf);
80}
81
82char *rfc822_getname_orlist(const struct rfc822a *rfc, int n)
83{
d9898ee8 84size_t addrbuflen=0;
85char *addrbuf, *ptr;
86
87 rfc822_prname_orlist(rfc, n, &cntlen, &addrbuflen);
88 if (!(addrbuf=malloc(addrbuflen+1)))
89 return (0);
90
91 ptr=addrbuf;
92 rfc822_prname_orlist(rfc, n, &saveaddr, &ptr);
93 addrbuf[addrbuflen]=0;
94
ac40fd9e 95 dropquotes(addrbuf);
d9898ee8 96 return (addrbuf);
97}
98
99char *rfc822_gettok(const struct rfc822token *t)
100{
101size_t addrbuflen=0;
102char *addrbuf, *ptr;
103
104 rfc822tok_print(t, &cntlen, &addrbuflen);
105
106 if (!(addrbuf=malloc(addrbuflen+1)))
107 return (0);
108
109 ptr=addrbuf;
110 rfc822tok_print(t, &saveaddr, &ptr);
111 addrbuf[addrbuflen]=0;
112 return (addrbuf);
113}