2 ** Copyright 2001-2011 Double Precision, Inc.
3 ** See COPYING for distribution information.
11 #include "rfc822hdr.h"
15 ** Read the next mail header.
18 int rfc822hdr_read(struct rfc822hdr
*h
, FILE *f
, off_t
*pos
, off_t epos
)
27 size_t hn
=h
->hdrsize
+ 1024;
28 char *p
= h
->header
? realloc(h
->header
, hn
):
38 if (pos
&& *pos
>= epos
)
69 if (c
== '\n' || c
== '\r' ||
70 !isspace((int)(unsigned char)c
))
77 if (h
->maxsize
&& n
+ 2 > h
->maxsize
)
89 for (h
->value
=h
->header
; *h
->value
; ++h
->value
)
95 isspace((int)(unsigned char)*h
->value
))
103 void rfc822hdr_fixname(struct rfc822hdr
*h
)
107 for (p
=h
->header
; *p
; p
++)
109 *p
=tolower((int)(unsigned char)*p
);
113 void rfc822hdr_collapse(struct rfc822hdr
*h
)
117 for (p
=q
=h
->value
; *p
; )
121 while (*p
&& isspace((int)(unsigned char)*p
))
131 /* This is, basically, a case-insensitive US-ASCII comparison function */
133 #define lc(x) ((x) >= 'A' && (x) <= 'Z' ? (x) + ('a'-'A'):(x))
135 int rfc822hdr_namecmp(const char *a
, const char *b
)
139 while ((rc
=(int)(unsigned char)lc(*a
) - (int)(unsigned char)lc(*b
))==0)
150 int rfc822hdr_is_addr(const char *hdr
)
152 return rfc822hdr_namecmp(hdr
, "from") == 0 ||
153 rfc822hdr_namecmp(hdr
, "to") == 0 ||
154 rfc822hdr_namecmp(hdr
, "cc") == 0 ||
155 rfc822hdr_namecmp(hdr
, "bcc") == 0 ||
156 rfc822hdr_namecmp(hdr
, "resent-from") == 0 ||
157 rfc822hdr_namecmp(hdr
, "resent-to") == 0 ||
158 rfc822hdr_namecmp(hdr
, "resent-cc") == 0 ||
159 rfc822hdr_namecmp(hdr
, "resent-bcc") == 0;