Mercurial > masqmail
annotate src/parse.c @ 304:d5ce2ba71e7b
manual formating of Received: hdrs; changed hdr for local receival
Now the Received: headers are much friendlier to read.
About folding: We must fold any line at 998 chars before transfer.
We should fold the lines we produce at 78 chars. That is what RFC
2821 requests. We should think about it, somewhen.
The header for locally (i.e. non-SMTP) received mail is changed
to the format postfix uses. This matches RFC 2821 better. The
`from' clause should contain a domain or IP, not a user name. Also,
the `with' clause should contain a registered standard protocol
name, which ``local'' is not.
author | markus schnalke <meillo@marmaro.de> |
---|---|
date | Thu, 09 Dec 2010 18:28:11 -0300 |
parents | 89199eda6144 |
children | 41958685480d |
rev | line source |
---|---|
0 | 1 /* MasqMail |
2 Copyright (C) 1999-2001 Oliver Kurth | |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
3 Copyright (C) 2010 markus schnalke <meillo@marmaro.de> |
0 | 4 |
5 This program is free software; you can redistribute it and/or modify | |
6 it under the terms of the GNU General Public License as published by | |
7 the Free Software Foundation; either version 2 of the License, or | |
8 (at your option) any later version. | |
9 | |
10 This program is distributed in the hope that it will be useful, | |
11 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 GNU General Public License for more details. | |
14 | |
15 You should have received a copy of the GNU General Public License | |
16 along with this program; if not, write to the Free Software | |
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
18 */ | |
19 | |
20 #ifndef PARSE_TEST | |
21 #include "masqmail.h" | |
22 #endif | |
23 | |
24 /* This is really dangerous. I hope that I was careful enough, | |
25 but maybe there is some malformed address possible that causes | |
26 this to segfault or be caught in endless loops. | |
27 | |
28 If you find something like that, PLEASE mail the string to me | |
29 (no matter how idiotic it is), so that I can debug that. | |
30 Those things really should not happen. | |
31 */ | |
32 | |
33 static gchar *specials = "()<>@,;:\\\".[]`"; | |
34 | |
35 char *parse_error = NULL; | |
36 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
37 static gchar* |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
38 skip_comment(gchar * p) |
0 | 39 { |
40 | |
41 #ifdef PARSE_TEST | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
42 g_print("skip_comment: %s\n", p); |
0 | 43 #endif |
44 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
45 p++; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
46 while (*p && *p != ')') { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
47 p++; |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
48 if (*p == '(') { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
49 p = skip_comment(p); |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
50 } |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
51 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
52 p++; |
0 | 53 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
54 return p; |
0 | 55 } |
56 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
57 static gboolean |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
58 read_word(gchar * p, gchar ** b, gchar ** e) |
0 | 59 { |
60 #ifdef PARSE_TEST | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
61 g_print("read_word: %s\n", p); |
0 | 62 #endif |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
63 /* eat leading spaces */ |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
64 while (*p && isspace(*p)) { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
65 p++; |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
66 } |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
67 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
68 *b = p; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
69 /* b = &p; */ |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
70 if (*p == '\"') { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
71 /* quoted-string */ |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
72 p++; |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
73 while (*p && (*p != '\"')) { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
74 p++; |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
75 } |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
76 p++; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
77 } else { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
78 /* atom */ |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
79 while (*p && !strchr(specials, *p) && !iscntrl(*p) && !isspace(*p)) { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
80 p++; |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
81 } |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
82 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
83 *e = p; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
84 return TRUE; |
0 | 85 } |
86 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
87 static gboolean |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
88 read_word_with_dots(gchar * p, gchar ** b, gchar ** e) |
0 | 89 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
90 gchar *b0 = p; |
0 | 91 |
92 #ifdef PARSE_TEST | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
93 g_print("read_word_with_dots: %s\n", p); |
0 | 94 #endif |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
95 while (TRUE) { |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
96 if (!read_word(p, b, e)) { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
97 return FALSE; |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
98 } |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
99 p = *e; |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
100 if (*p != '.') { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
101 break; |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
102 } |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
103 p++; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
104 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
105 *b = b0; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
106 *e = p; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
107 return TRUE; |
0 | 108 } |
109 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
110 static gboolean |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
111 read_domain(gchar * p, gchar ** b, gchar ** e) |
0 | 112 { |
113 #ifdef PARSE_TEST | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
114 g_print("read_domain: %s\n", p); |
0 | 115 #endif |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
116 *b = p; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
117 if (*p != '[') { |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
118 while (isalnum(*p) || (*p == '-') || (*p == '.')) { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
119 p++; |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
120 } |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
121 } else { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
122 p++; |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
123 while (isalpha(*p) || (*p == '.')) { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
124 p++; |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
125 } |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
126 if (*p != ']') { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
127 parse_error = g_strdup_printf("']' expected at end of literal address %s", *b); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
128 return FALSE; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
129 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
130 p++; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
131 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
132 *e = p; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
133 return TRUE; |
0 | 134 } |
135 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
136 gboolean |
15 | 137 parse_address_rfc822(gchar* string, gchar** local_begin, gchar** local_end, gchar** domain_begin, |
138 gchar** domain_end, gchar** address_end) | |
0 | 139 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
140 gint angle_brackets = 0; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
141 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
142 gchar *p = string; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
143 gchar *b, *e; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
144 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
145 *local_begin = *local_end = NULL; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
146 *domain_begin = *domain_end = NULL; |
0 | 147 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
148 /* might be some memory left from previous call: */ |
273
00724782b6c9
parse.c: comments, better debugging, tiny refactoring
markus schnalke <meillo@marmaro.de>
parents:
271
diff
changeset
|
149 if (parse_error) { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
150 g_free(parse_error); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
151 parse_error = NULL; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
152 } |
0 | 153 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
154 /* leading spaces and angle brackets */ |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
155 while (*p && (isspace(*p) || (*p == '<'))) { |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
156 if (*p == '<') { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
157 angle_brackets++; |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
158 } |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
159 p++; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
160 } |
0 | 161 |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
162 if (!*p) { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
163 return FALSE; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
164 } |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
165 |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
166 while (TRUE) { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
167 if (!read_word_with_dots(p, &b, &e)) { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
168 return FALSE; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
169 } |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
170 |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
171 p = e; |
0 | 172 #ifdef PARSE_TEST |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
173 g_print("after read_word_with_dots: %s\n", p); |
0 | 174 #endif |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
175 /* eat white spaces and comments */ |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
176 while ((*p && (isspace(*p))) || (*p == '(')) { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
177 if (*p == '(') { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
178 if (!(p = skip_comment(p))) { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
179 parse_error = g_strdup("missing right bracket ')'"); |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
180 return FALSE; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
181 } |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
182 } else { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
183 p++; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
184 } |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
185 } |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
186 /* we now have a non-space char that is not |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
187 the beginning of a comment */ |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
188 |
274
89199eda6144
fixed `To: alice, bob' with -t
markus schnalke <meillo@marmaro.de>
parents:
273
diff
changeset
|
189 if (*p == '@' || *p == ',') { |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
190 /* the last word was the local_part of an addr-spec */ |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
191 *local_begin = b; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
192 *local_end = e; |
0 | 193 #ifdef PARSE_TEST |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
194 g_print("found local part: %s\n", *local_begin); |
0 | 195 #endif |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
196 if (*p == '@') { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
197 p++; /* skip @ */ |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
198 /* now the domain */ |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
199 if (!read_domain(p, &b, &e)) { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
200 return FALSE; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
201 } |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
202 p = e; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
203 *domain_begin = b; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
204 *domain_end = e; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
205 } else { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
206 /* unqualified? */ |
274
89199eda6144
fixed `To: alice, bob' with -t
markus schnalke <meillo@marmaro.de>
parents:
273
diff
changeset
|
207 /* something like `To: alice, bob' with -t */ |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
208 *domain_begin = *domain_end = NULL; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
209 } |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
210 break; |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
211 |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
212 } else if (*p == '<') { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
213 /* addr-spec follows */ |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
214 while (isspace(*p) || (*p == '<')) { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
215 if (*p == '<') { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
216 angle_brackets++; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
217 } |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
218 p++; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
219 } |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
220 if (!read_word_with_dots(p, &b, &e)) { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
221 return FALSE; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
222 } |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
223 p = e; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
224 *local_begin = b; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
225 *local_end = e; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
226 #ifdef PARSE_TEST |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
227 g_print("found local part: %s\n", *local_begin); |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
228 #endif |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
229 if (*p == '@') { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
230 p++; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
231 if (!read_domain(p, &b, &e)) { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
232 return FALSE; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
233 } |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
234 p = e; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
235 *domain_begin = b; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
236 *domain_end = e; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
237 } else { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
238 /* may be unqualified address */ |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
239 *domain_begin = *domain_end = NULL; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
240 } |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
241 break; |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
242 |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
243 } else if (!*p || *p == '>') { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
244 *local_begin = b; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
245 *local_end = e; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
246 #ifdef PARSE_TEST |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
247 g_print("found local part: %s\n", *local_begin); |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
248 #endif |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
249 *domain_begin = *domain_end = NULL; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
250 break; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
251 |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
252 } else if (strchr(specials, *p) || iscntrl(*p) || isspace(*p)) { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
253 parse_error = g_strdup_printf("unexpected character: %c", *p); |
273
00724782b6c9
parse.c: comments, better debugging, tiny refactoring
markus schnalke <meillo@marmaro.de>
parents:
271
diff
changeset
|
254 #ifdef PARSE_TEST |
00724782b6c9
parse.c: comments, better debugging, tiny refactoring
markus schnalke <meillo@marmaro.de>
parents:
271
diff
changeset
|
255 g_print("unexpected character: %c", *p); |
00724782b6c9
parse.c: comments, better debugging, tiny refactoring
markus schnalke <meillo@marmaro.de>
parents:
271
diff
changeset
|
256 #endif |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
257 return FALSE; |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
258 } |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
259 } |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
260 |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
261 /* trailing spaces and angle brackets */ |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
262 #ifdef PARSE_TEST |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
263 g_print("down counting trailing '>'\n"); |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
264 #endif |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
265 while (*p && (isspace(*p) || (*p == '>'))) { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
266 if (*p == '>') { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
267 angle_brackets--; |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
268 } |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
269 p++; |
0 | 270 } |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
271 |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
272 *address_end = p; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
273 |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
274 if (angle_brackets > 0) { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
275 parse_error = g_strdup("missing '>' at end of string"); |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
276 return FALSE; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
277 } else if (angle_brackets < 0) { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
278 parse_error = g_strdup("superfluous '>' at end of string"); |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
279 return FALSE; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
280 } |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
281 |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
282 /* we successfully parsed the address */ |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
283 return TRUE; |
0 | 284 } |
285 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
286 gboolean |
15 | 287 parse_address_rfc821(gchar* string, gchar** local_begin, gchar** local_end, gchar** domain_begin, |
288 gchar** domain_end, gchar** address_end) | |
0 | 289 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
290 gint angle_brackets = 0; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
291 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
292 gchar *p = string; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
293 gchar *b, *e; |
0 | 294 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
295 *local_begin = *local_end = NULL; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
296 *domain_begin = *domain_end = NULL; |
0 | 297 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
298 /* might be some memory left from previous call: */ |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
299 if (parse_error != NULL) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
300 g_free(parse_error); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
301 parse_error = NULL; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
302 } |
0 | 303 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
304 /* leading spaces and angle brackets */ |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
305 while (*p && (isspace(*p) || (*p == '<'))) { |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
306 if (*p == '<') { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
307 angle_brackets++; |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
308 } |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
309 p++; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
310 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
311 |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
312 if (!*p) { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
313 return FALSE; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
314 } |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
315 |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
316 while (TRUE) { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
317 if (!read_word_with_dots(p, &b, &e)) { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
318 return FALSE; |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
319 } |
0 | 320 |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
321 p = e; |
0 | 322 #ifdef PARSE_TEST |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
323 g_print("after read_word_with_dots: %s\n", p); |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
324 #endif |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
325 *local_begin = b; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
326 *local_end = e; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
327 #ifdef PARSE_TEST |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
328 g_print("found local part: %s\n", *local_begin); |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
329 g_print("local_end = %s\n", *local_end); |
0 | 330 #endif |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
331 if (!(*p) || isspace(*p) || (*p == '>')) { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
332 /* unqualified ? */ |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
333 domain_begin = domain_end = NULL; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
334 break; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
335 } else if (*p == '@') { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
336 p++; |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
337 if (read_domain(p, &b, &e)) { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
338 p = e; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
339 *domain_begin = b; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
340 *domain_end = e; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
341 } |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
342 break; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
343 } else { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
344 parse_error = g_strdup_printf ("unexpected character after local part '%c'", *p); |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
345 return FALSE; |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
346 } |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
347 } |
0 | 348 |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
349 /* trailing spaces and angle brackets */ |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
350 #ifdef PARSE_TEST |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
351 g_print("down counting trailing '>'\n"); |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
352 #endif |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
353 while (*p && (isspace(*p) || (*p == '>'))) { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
354 if (*p == '>') { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
355 angle_brackets--; |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
356 } |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
357 p++; |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
358 } |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
359 *address_end = p; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
360 |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
361 if (angle_brackets > 0) { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
362 parse_error = g_strdup("missing '>' at end of string"); |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
363 return FALSE; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
364 } else if (angle_brackets < 0) { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
365 parse_error = g_strdup("superfluous '>' at end of string"); |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
366 return FALSE; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
367 } |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
368 |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
369 /* we successfully parsed the address */ |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
370 return TRUE; |
0 | 371 } |
372 | |
373 /* | |
374 allocate address, reading from string. | |
375 On failure, returns NULL. | |
114 | 376 after call, end contains a pointer to the end of the parsed string |
0 | 377 end may be NULL, if we are not interested. |
378 | |
379 parses both rfc 821 and rfc 822 addresses, depending on flag is_rfc821 | |
380 */ | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
381 address* |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
382 _create_address(gchar * string, gchar ** end, gboolean is_rfc821) |
0 | 383 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
384 gchar *loc_beg, *loc_end; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
385 gchar *dom_beg, *dom_end; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
386 gchar *addr_end; |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
387 gboolean ret; |
0 | 388 |
273
00724782b6c9
parse.c: comments, better debugging, tiny refactoring
markus schnalke <meillo@marmaro.de>
parents:
271
diff
changeset
|
389 /* TODO: what about (string == NULL)? */ |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
390 if (string && (string[0] == '\0')) { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
391 address *addr = g_malloc(sizeof(address)); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
392 addr->address = g_strdup(""); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
393 addr->local_part = g_strdup(""); |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
394 /* 'NULL' address (failure notice), |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
395 "" makes sure it will not be qualified with a hostname */ |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
396 addr->domain = g_strdup(""); |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
397 return addr; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
398 } |
0 | 399 |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
400 if (is_rfc821) { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
401 ret = parse_address_rfc821(string, &loc_beg, &loc_end, &dom_beg, &dom_end, &addr_end); |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
402 } else { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
403 ret = parse_address_rfc822(string, &loc_beg, &loc_end, &dom_beg, &dom_end, &addr_end); |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
404 } |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
405 if (!ret) { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
406 return NULL; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
407 } |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
408 |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
409 address *addr = g_malloc(sizeof(address)); |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
410 gchar *p = addr_end; |
0 | 411 |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
412 memset(addr, 0, sizeof(address)); |
0 | 413 |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
414 if (loc_beg[0] == '|') { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
415 parse_error = g_strdup("no pipe allowed for RFC 822/821 address"); |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
416 return NULL; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
417 } |
0 | 418 |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
419 while (*p && (*p != ',')) { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
420 p++; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
421 } |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
422 addr->address = g_strndup(string, p - string); |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
423 addr->local_part = g_strndup(loc_beg, loc_end - loc_beg); |
0 | 424 |
425 #ifdef PARSE_TEST | |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
426 g_print("addr->local_part = %s\n", addr->local_part); |
0 | 427 #endif |
428 | |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
429 if (dom_beg != NULL) { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
430 addr->domain = g_strndup(dom_beg, dom_end - dom_beg); |
273
00724782b6c9
parse.c: comments, better debugging, tiny refactoring
markus schnalke <meillo@marmaro.de>
parents:
271
diff
changeset
|
431 } else if (addr->local_part[0] == '\0') { |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
432 /* 'NULL' address (failure notice), |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
433 "" makes sure it will not be qualified with a hostname */ |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
434 addr->domain = g_strdup(""); |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
435 } else { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
436 addr->domain = NULL; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
437 } |
0 | 438 |
273
00724782b6c9
parse.c: comments, better debugging, tiny refactoring
markus schnalke <meillo@marmaro.de>
parents:
271
diff
changeset
|
439 if (end) { |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
440 *end = p; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
441 } |
0 | 442 |
443 #ifndef PARSE_TEST | |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
444 addr_unmark_delivered(addr); |
0 | 445 #endif |
446 | |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
447 return addr; |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
448 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
449 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
450 address* |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
451 create_address_rfc822(gchar * string, gchar ** end) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
452 { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
453 return _create_address(string, end, FALSE); |
0 | 454 } |
455 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
456 address* |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
457 create_address_rfc821(gchar * string, gchar ** end) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
458 { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
459 return _create_address(string, end, TRUE); |
0 | 460 } |
461 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
462 GList* |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
463 addr_list_append_rfc822(GList * addr_list, gchar * string, gchar * domain) |
0 | 464 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
465 gchar *p = string; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
466 gchar *end; |
0 | 467 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
468 while (*p) { |
273
00724782b6c9
parse.c: comments, better debugging, tiny refactoring
markus schnalke <meillo@marmaro.de>
parents:
271
diff
changeset
|
469 #ifdef PARSE_TEST |
00724782b6c9
parse.c: comments, better debugging, tiny refactoring
markus schnalke <meillo@marmaro.de>
parents:
271
diff
changeset
|
470 g_print("string: %s\n", p); |
00724782b6c9
parse.c: comments, better debugging, tiny refactoring
markus schnalke <meillo@marmaro.de>
parents:
271
diff
changeset
|
471 #endif |
00724782b6c9
parse.c: comments, better debugging, tiny refactoring
markus schnalke <meillo@marmaro.de>
parents:
271
diff
changeset
|
472 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
473 address *addr = _create_address(p, &end, FALSE); |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
474 if (!addr) { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
475 break; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
476 } |
0 | 477 |
273
00724782b6c9
parse.c: comments, better debugging, tiny refactoring
markus schnalke <meillo@marmaro.de>
parents:
271
diff
changeset
|
478 #ifdef PARSE_TEST |
00724782b6c9
parse.c: comments, better debugging, tiny refactoring
markus schnalke <meillo@marmaro.de>
parents:
271
diff
changeset
|
479 g_print("addr: %s (%s<@>%s)", addr->address, addr->local_part, addr->domain); |
00724782b6c9
parse.c: comments, better debugging, tiny refactoring
markus schnalke <meillo@marmaro.de>
parents:
271
diff
changeset
|
480 #endif |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
481 if (domain && !addr->domain) { |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
482 addr->domain = g_strdup(domain); |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
483 } |
273
00724782b6c9
parse.c: comments, better debugging, tiny refactoring
markus schnalke <meillo@marmaro.de>
parents:
271
diff
changeset
|
484 #ifdef PARSE_TEST |
00724782b6c9
parse.c: comments, better debugging, tiny refactoring
markus schnalke <meillo@marmaro.de>
parents:
271
diff
changeset
|
485 g_print(" (%s<@>%s)\n", addr->local_part, addr->domain); |
00724782b6c9
parse.c: comments, better debugging, tiny refactoring
markus schnalke <meillo@marmaro.de>
parents:
271
diff
changeset
|
486 #endif |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
487 |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
488 addr_list = g_list_append(addr_list, addr); |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
489 p = end; |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
490 |
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
491 while (*p == ',' || isspace(*p)) { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
492 p++; |
271
899175e8dff0
heavy refactoring in the small of parse.c
markus schnalke <meillo@marmaro.de>
parents:
114
diff
changeset
|
493 } |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
494 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
495 return addr_list; |
0 | 496 } |