git.fiddlerwoaroof.com
Browse code

2007-09-20 Ahmon Dancy <dancy@dancy>

layer authored on 20/09/2007 18:22:42
Showing 2 changed files
... ...
@@ -1,3 +1,10 @@
1
+2007-09-20  Ahmon Dancy  <dancy@dancy>
2
+
3
+	* rfe7462: rfc2822.cl (extract-email-addresses): New 'compact'
4
+	keyword arg to return results in a simpler format.  Also
5
+	includes a parsing bugfix for some unusual but legal
6
+	addresses.  
7
+
1 8
 2007-08-02  Ahmon Dancy  <dancy@dancy>
2 9
 
3 10
 	* mime-parse.cl:
... ...
@@ -14,7 +14,7 @@
14 14
 ;; merchantability or fitness for a particular purpose.  See the GNU
15 15
 ;; Lesser General Public License for more details.
16 16
 ;;
17
-;; $Id: rfc2822.cl,v 1.9 2007/06/06 16:59:01 layer Exp $
17
+;; $Id: rfc2822.cl,v 1.10 2007/09/20 18:22:42 layer Exp $
18 18
 
19 19
 #+(version= 8 0)
20 20
 (sys:defpatch "rfc2822" 0
... ...
@@ -22,9 +22,9 @@
22 22
   :type :system
23 23
   :post-loadable t)
24 24
 
25
-#+(version= 8 1 beta)
25
+#+(version= 8 1)
26 26
 (sys:defpatch "rfc2822" 1
27
-  "v0: New extract-email-addresses function."
27
+  "v1: extract-email-addresses enhancements & parsing fix."
28 28
   :type :system
29 29
   :post-loadable t)
30 30
 
... ...
@@ -141,9 +141,12 @@ domain.
141 141
 ;;  (:mailbox display-name user domain)
142 142
 ;;  or
143 143
 ;;  (:group display-name mailbox-list)
144
+;; or, if 'compact' keyword arg is true, returns a flattened list of 
145
+;;  user@domain strings.
144 146
 
145 147
 (defun extract-email-addresses (string &key (start 0) (end (length string))
146
-					    (require-domain t) (errorp t))
148
+					    (require-domain t) (errorp t)
149
+					    compact)
147 150
   (declare (optimize (speed 3))
148 151
 	   (fixnum start end))
149 152
   (with-underlying-simple-vector (string string disp)
... ...
@@ -168,8 +171,28 @@ domain.
168 171
 	 then (if errorp 
169 172
 		  (error "Failed to parse: ~s" (subseq string start end)))
170 173
 	      nil
174
+       elseif compact
175
+	 then (compact-extracted-addresses res)
171 176
 	 else res))))
172 177
 
178
+(defun compact-extracted-addresses (list)
179
+  (declare (optimize (speed 3)))
180
+  (let (res)
181
+    (dolist (entry list)
182
+      (let ((type (car entry)))
183
+	(ecase type
184
+	  (:mailbox
185
+	   (let ((user (third entry))
186
+		 (domain (fourth entry)))
187
+	     (push (if* domain
188
+		      then (concatenate 'string user "@" domain)
189
+		      else user)
190
+		   res)))
191
+	  (:group
192
+	   (dolist (addr (compact-extracted-addresses (third entry)))
193
+	     (push addr res))))))
194
+    (nreverse res)))
195
+
173 196
 (macrolet ((parse-special (char skip-ws)
174 197
 	     `(multiple-value-bind (type value newpos)
175 198
 		  (rfc2822-lex string start end ,skip-ws)
... ...
@@ -281,7 +304,7 @@ domain.
281 304
 		(setf first nil)
282 305
 		(setf start newpos)
283 306
 	   else (return)))
284
-      (if (and res (match-re "^\\s" (first res)))
307
+      (if (and (stringp res) (match-re "^\\s" (first res)))
285 308
 	  (pop res))
286 309
       (if res 
287 310
 	  (values (list-to-delimited-string (nreverse res) "") start))))