git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH/RFC v4 07/10] send-email: reduce dependancies impact on parse_address_line

From
Remi Lespinet <remi.lespinet@ensimag.grenoble-inp.fr>
Date
Jun 18, 2015, 15:08 UTC
Message-ID
<1444764681.621777.1434640131682.JavaMail.zimbra@ensimag.grenoble-inp.fr>
In-Reply-To
<vpqh9q56yaf.fsf@anie.imag.fr>
Show 8 quoted lines
> Remi Lespinet <remi.lespinet@ensimag.grenoble-inp.fr> writes:
> 
> > I've some more tests, maybe I should put them all in this post ?
> 
> Yes, please post as much as you have. Ideally, this should be
> automatically tested, but if you don't have time to write the automated
> tests, at least having a track of what you did on the list archives can
> help someone else to do it.

It may not be easily readable without colors, so there are the scripts at the end. You can change the tested input by changing lines after the "cat >.tmplist" line in testall.sh. (There are two scripts testall.sh and testone.perl).

Here are the tests results:
Input: 
Split: 
M::A : 
Same : Yes
----------
Input: Jane
Split: Jane
M::A : Jane
Same : Yes
----------
Input: jdoe@example.com
Split: jdoe@example.com
M::A : jdoe@example.com
Same : Yes
----------
Input: <jdoe@example.com>
Split: jdoe@example.com
M::A : jdoe@example.com
Same : Yes
----------
Input: Jane <jdoe@example.com>
Split: Jane <jdoe@example.com>
M::A : Jane <jdoe@example.com>
Same : Yes
----------
Input: Jane Doe <jdoe@example.com>
Split: Jane Doe <jdoe@example.com>
M::A : Jane Doe <jdoe@example.com>
Same : Yes
----------
Input: Jane\ Doe <jdoe@example.com>
Split: "Jane\ Doe" <jdoe@example.com>
M::A : "Jane \ Doe" <jdoe@example.com>
Same : No
----------
Input: "Jane" <jdoe@example.com>
Split: "Jane" <jdoe@example.com>
M::A : "Jane" <jdoe@example.com>
Same : Yes
----------
Input: "Doe, Jane" <jdoe@example.com>
Split: "Doe, Jane" <jdoe@example.com>
M::A : "Doe, Jane" <jdoe@example.com>
Same : Yes
----------
Input: "Doe, Ja"ne <jdoe@example.com>
Split: "Doe, Ja ne" <jdoe@example.com>
M::A : "Doe, Ja" ne <jdoe@example.com>
Same : No
----------
Input: "Doe, Katarina" Jane <jdoe@example.com>
Split: "Doe, Katarina Jane" <jdoe@example.com>
M::A : "Doe, Katarina" Jane <jdoe@example.com>
Same : No
----------
Input: "Jane@:;\>.,()<Doe" <jdoe@example.com>
Split: "Jane@:;\>.,()<Doe" <jdoe@example.com>
M::A : "Jane@:;\>.,()<Doe" <jdoe@example.com>
Same : Yes
----------
Input: Jane@:;\.,()<>Doe <jdoe@example.com>
Split: Jane@:
     : "\."
     : Doe <jdoe@example.com> ()
M::A : Jane@:
     : \.
     : Doe <jdoe@example.com> ()
Same : No
----------
Input: Jane!#$%&'*+-/=?^_{|}~Doe' <jdoe@example.com>
Split: Jane!#$%&'*+-/=?^_{|}~Doe' <jdoe@example.com>
M::A : Jane!#$%&'*+-/=?^_{|}~Doe' <jdoe@example.com>
Same : Yes
----------
Input: "<jdoe@example.com>"
Split: "<jdoe@example.com>"
M::A : "<jdoe@example.com>"
Same : Yes
----------
Input: "Jane jdoe@example.com"
Split: "Jane jdoe@example.com"
M::A : "Jane jdoe@example.com"
Same : Yes
----------
Input: Jane Doe <jdoe    @   example.com  >
Split: Jane Doe <jdoe@example.com>
M::A : Jane Doe <jdoe@example.com>
Same : Yes
----------
Input: Jane       Doe <  jdoe@example.com  >
Split: Jane Doe <jdoe@example.com>
M::A : Jane Doe <jdoe@example.com>
Same : Yes
----------
Input: Jane @ Doe @ Jane @ Doe
Split: Jane@Doe@Jane@Doe
M::A : Jane@Doe@Jane@Doe
Same : Yes
----------
Input: Jane jdoe@example.com
Split: Janejdoe@example.com
M::A : Jane
     : jdoe@example.com
Same : No
----------
Input: <jdoe@example.com> Jane Doe
Split: jdoe@example.comJaneDoe
M::A : Jane Doe <jdoe@example.com>
Same : No
----------
Input: Jane <jdoe@example.com> Doe
Split: Jane <jdoe@example.comDoe>
M::A : Jane Doe <jdoe@example.com>
Same : No
----------
Input: "Jane, 'Doe'" <jdoe@example.com>
Split: "Jane, 'Doe'" <jdoe@example.com>
M::A : "Jane, 'Doe'" <jdoe@example.com>
Same : Yes
----------
Input: 'Doe, "Jane' <jdoe@example.com>
Split: 'Doe
     : " Jane' <jdoe@example.com>
M::A : 'Doe
     : " Jane' <jdoe@example.com>
Same : Yes
----------
Input: "Jane" "Do"e <jdoe@example.com>
Split: "Jane" "Do" e <jdoe@example.com>
M::A : "Jane" "Do" e <jdoe@example.com>
Same : Yes
----------
Input: "Jane' Doe" <jdoe@example.com>
Split: "Jane' Doe" <jdoe@example.com>
M::A : "Jane' Doe" <jdoe@example.com>
Same : Yes
----------
Input: "Jane Doe <jdoe@example.com>" <jdoe@example.com>
Split: "Jane Doe <jdoe@example.com>" <jdoe@example.com>
M::A : "Jane Doe <jdoe@example.com>" <jdoe@example.com>
Same : Yes
----------
Input: "Jane\" Doe" <jdoe@example.com>
Split: "Jane\" Doe" <jdoe@example.com>
M::A : "Jane\" Doe" <jdoe@example.com>
Same : Yes
----------
Input: Doe, jane <jdoe@example.com>
Split: Doe
     : jane <jdoe@example.com>
M::A : Doe
     : jane <jdoe@example.com>
Same : Yes
----------
Input: "Jane Doe <jdoe@example.com>
Split: " Jane Doe <jdoe@example.com>
M::A : " Jane Doe <jdoe@example.com>
Same : Yes
----------
Input: "Jane "Kat"a" ri"na" ",Doe" <jdoe@example.com>
Split: "Jane  Kat a ri na ,Doe" <jdoe@example.com>
M::A : "Jane " Kat "a" ri "na" ",Doe" <jdoe@example.com>
Same : No
----------
Input: Jane Doe
Split: Jane Doe
M::A : Jane
     : Doe
Same : No
----------
Input: Jane "Doe <jdoe@example.com>"
Split: "Jane Doe <jdoe@example.com>"
M::A : Jane
     : "Doe <jdoe@example.com>"
Same : No
----------
Input: \"Jane Doe <jdoe@example.com>
Split: "\"Jane Doe" <jdoe@example.com>
M::A : \ " Jane Doe <jdoe@example.com>
Same : No
----------
Input: Jane\"\" Doe <jdoe@example.com>
Split: "Jane\"\" Doe" <jdoe@example.com>
M::A : Jane \ " \ " Doe <jdoe@example.com>
Same : No
----------
Input: 'Jane 'Doe' <jdoe@example.com>
Split: 'Jane 'Doe' <jdoe@example.com>
M::A : 'Jane 'Doe' <jdoe@example.com>
Same : Yes
----------
Input: 'Jane "Katarina\" \' Doe' <jdoe@example.com>
Split: "'Jane  Katarina\" \' Doe'" <jdoe@example.com>
M::A : 'Jane " Katarina \ " \ ' Doe' <jdoe@example.com>
Same : No
**********************************************************************
*                          SCRIPTS PART                              *
**********************************************************************
---------------------------- testall.sh ----------------------------
#!/bin/sh
cat >.tmplist <<EOF

Jane jdoe@example.com <jdoe@example.com> Jane <jdoe@example.com> Jane Doe <jdoe@example.com> Jane\ Doe <jdoe@example.com> "Jane" <jdoe@example.com> "Doe, Jane" <jdoe@example.com> "Doe, Ja"ne <jdoe@example.com> "Doe, Katarina" Jane <jdoe@example.com> "Jane@:;\>.,()<Doe" <jdoe@example.com> Jane@:;\.,()<>Doe <jdoe@example.com> Jane!#$%&'*+-/=?^_{|}~Doe' <jdoe@example.com> "<jdoe@example.com>" "Jane jdoe@example.com" Jane Doe <jdoe @ example.com > Jane Doe < jdoe@example.com > Jane @ Doe @ Jane @ Doe Jane jdoe@example.com <jdoe@example.com> Jane Doe Jane <jdoe@example.com> Doe "Jane, 'Doe'" <jdoe@example.com> 'Doe, "Jane' <jdoe@example.com> "Jane" "Do"e <jdoe@example.com> "Jane' Doe" <jdoe@example.com> "Jane Doe <jdoe@example.com>" <jdoe@example.com> "Jane\" Doe" <jdoe@example.com> Doe, jane <jdoe@example.com> "Jane Doe <jdoe@example.com> "Jane "Kat"a" ri"na" ",Doe" <jdoe@example.com> Jane Doe Jane "Doe <jdoe@example.com>" \"Jane Doe <jdoe@example.com> Jane\"\" Doe <jdoe@example.com> 'Jane 'Doe' <jdoe@example.com> 'Jane "Katarina\" \' Doe' <jdoe@example.com> EOF

cat .tmplist | while read -r line
do
    echo "Input: $line"
    ./testone.perl "$line"
    echo ----------
done
---------------------------- testone.perl ----------------------------
#!/usr/bin/perl

use strict; use warnings;

use Term::ANSIColor; use Mail::Address; use Text::ParseWords;

my $string = $ARGV[0];
sub split_addrs {
	my $re_comment = qr/\((?:[^)]*)\)/;
	my $re_quote = qr/"(?:[^\"\\]|\\.)*"/;
	my $re_word = qr/(?:[^]["\s()<>:;@\\,.]|\\.)+/;
	my $re_token = qr/(?:$re_quote|$re_word|$re_comment|\S)/;
	my @tokens = map { $_ =~ /\s*($re_token)\s*/g } @_;
	push @tokens, ",";
	my (@addr_list, @phrase, @address, @comment, @buffer) = ();
	foreach my $token (@tokens) {
		if ($token =~ /^[,;]$/) {
			if (@address) {
				push @address, @buffer;
			} else {
				push @phrase, @buffer;
			}
		
			my $str_phrase = join ' ', @phrase;
			my $str_address = join '', @address;
			my $str_comment = join ' ', @comment;
		
			if ($str_phrase =~ /[][()<>:;@\\,.\000-\037\177]/) {
				$str_phrase =~ s/(^|[^\\])"/$1/g;
				$str_phrase = qq["$str_phrase"];
			}
		
			if ($str_address ne "" && $str_phrase ne "") {
				$str_address = qq[<$str_address>];
			}
		
			my $str_mailbox = "$str_phrase $str_address $str_comment";
			$str_mailbox =~ s/^\s*|\s*$//g;
			push @addr_list, $str_mailbox if ($str_mailbox);
		
			@phrase = @address = @comment = @buffer = ();
		} elsif ($token =~ /^\(/) {
			push @comment, $token;
		} elsif ($token eq "<") {
			push @phrase, (splice @address), (splice @buffer);
		} elsif ($token eq ">") {
			push @address, (splice @buffer);
		} elsif ($token eq "@") {
			push @address, (splice @buffer), "@";
		} elsif ($token eq ".") {
			push @address, (splice @buffer), ".";
		} else {
			push @buffer, $token;
		}
	}
	return @addr_list;
}
sub old_split {
	quotewords('\s*,\s*', 1, $_[0]);
}

my @tab = split_addrs($string); my @ref = map { $_->format } Mail::Address->parse($string); # my @old = old_split($string); #can be printed to see the difference

my $tabstring = join "\n", @tab; my $refstring = join "\n", @ref; my $same = ($tabstring eq $refstring);

$tabstring =~ s/\n/\n : /g; $refstring =~ s/\n/\n : /g;

print color 'bold yellow'; print "Split: ", "$tabstring", "\n";

print color 'bold blue'; print "M::A : ", "$refstring", "\n";

if ($same) {
	print color 'bold green';
	print "Same : ", "Yes", "\n";
} else {
	print color 'bold red';
	print "Same : ", "No", "\n";
}
print color 'reset';
 
Previous: Matthieu MoyNext: Matthieu Moy
Message 14 of 50 in “t9001-send-email: move script creation in a setup test”
  1. 01/10 t9001-send-email: move script creation in a setup testRemi Lespinet, Jun 17, 2015
  2. 02/10 send-email: allow aliases in patch header and command script outputsRemi Lespinet, Jun 17, 2015
  3. 03/10 t9001-send-email: refactor header variable fields replacementRemi Lespinet, Jun 17, 2015
  4. 04/10 send-email: refactor address list processRemi Lespinet, Jun 17, 2015
  5. 05/10 send-email: Allow use of aliases in the From field of --compose modeRemi Lespinet, Jun 17, 2015
  6. Matthieu MoyJun 17, 2015
  7. 06/10 send-email: minor code refactoringRemi Lespinet, Jun 17, 2015
  8. 07/10 send-email: reduce dependancies impact on parse_address_lineRemi Lespinet, Jun 17, 2015
  9. Matthieu MoyJun 17, 2015
  10. 07/10 send-email: reduce dependancies impact on parse_address_lineRemi Lespinet, Jun 17, 2015
  11. Junio C HamanoJun 17, 2015
  12. 07/10 send-email: reduce dependancies impact on parse_address_lineRemi Lespinet, Jun 17, 2015
  13. Matthieu MoyJun 18, 2015
  14. 07/10 send-email: reduce dependancies impact on parse_address_lineRemi Lespinet, Jun 18, 2015
  15. Matthieu MoyJun 18, 2015
  16. 07/10 send-email: reduce dependancies impact on parse_address_lineRemi Lespinet, Jun 18, 2015
  17. Matthieu MoyJun 19, 2015
  18. 08/10 send-email: consider quote as delimiter instead of characterRemi Lespinet, Jun 17, 2015
  19. 09/10 send-email: allow multiple emails using --cc, --to and --bccRemi Lespinet, Jun 17, 2015
  20. 10/10 send-email: suppress meaningless whitespaces in from fieldRemi Lespinet, Jun 17, 2015
  21. Matthieu MoyJun 17, 2015
  22. 10/10 send-email: suppress meaningless whitespaces in from fieldRemi Lespinet, Jun 17, 2015
  23. 01/10 t9001-send-email: move script creation in a setup testRemi Lespinet, Jun 20, 2015
  24. 02/10 send-email: allow aliases in patch header and command script outputsRemi Lespinet, Jun 20, 2015
  25. 03/10 t9001-send-email: refactor header variable fields replacementRemi Lespinet, Jun 20, 2015
  26. 04/10 send-email: refactor address list processRemi Lespinet, Jun 20, 2015
  27. 05/10 send-email: Allow use of aliases in the From field of --compose modeRemi Lespinet, Jun 20, 2015
  28. 06/10 send-email: minor code refactoringRemi Lespinet, Jun 20, 2015
  29. 07/10 send-email: reduce dependancies impact on parse_address_lineRemi Lespinet, Jun 20, 2015
  30. Matthieu MoyJun 21, 2015
  31. 07/10 send-email: reduce dependancies impact on parse_address_lineRemi Lespinet, Jun 21, 2015
  32. 07/10 send-email: reduce dependancies impact on parse_address_lineRemi Lespinet, Jun 23, 2015
  33. Matthieu MoyJun 21, 2015
  34. 08/10 send-email: consider quote as delimiter instead of characterRemi Lespinet, Jun 21, 2015
  35. 09/10 send-email: allow multiple emails using --cc, --to and --bccRemi Lespinet, Jun 21, 2015
  36. Matthieu MoyJun 21, 2015
  37. 10/10 send-email: suppress meaningless whitespaces in from fieldRemi Lespinet, Jun 21, 2015
  38. 01/10 t9001-send-email: move script creation in a setup testRemi Lespinet, Jun 23, 2015
  39. 02/10 send-email: allow aliases in patch header and command script outputsRemi Lespinet, Jun 23, 2015
  40. 03/10 t9001-send-email: refactor header variable fields replacementRemi Lespinet, Jun 23, 2015
  41. 04/10 send-email: refactor address list processRemi Lespinet, Jun 23, 2015
  42. 05/10 send-email: Allow use of aliases in the From field of --compose modeRemi Lespinet, Jun 23, 2015
  43. 06/10 send-email: minor code refactoringRemi Lespinet, Jun 23, 2015
  44. 07/10 send-email: reduce dependencies impact on parse_address_lineRemi Lespinet, Jun 23, 2015
  45. Matthieu MoyJun 23, 2015
  46. 07/10 send-email: reduce dependencies impact on parse_address_lineRemi LESPINET, Jun 23, 2015
  47. 08/10 send-email: consider quote as delimiter instead of characterRemi Lespinet, Jun 23, 2015
  48. 09/10 send-email: allow multiple emails using --cc, --to and --bccRemi Lespinet, Jun 23, 2015
  49. Matthieu MoyJun 23, 2015
  50. 10/10 send-email: suppress meaningless whitespaces in from fieldRemi Lespinet, Jun 23, 2015

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.