mail 2.6.6 → 2.7.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.rdoc +25 -6
  3. data/Dependencies.txt +0 -1
  4. data/Gemfile +5 -8
  5. data/MIT-LICENSE +1 -1
  6. data/README.md +22 -11
  7. data/Rakefile +0 -6
  8. data/lib/mail.rb +2 -10
  9. data/lib/mail/attachments_list.rb +3 -2
  10. data/lib/mail/body.rb +3 -3
  11. data/lib/mail/core_extensions/smtp.rb +19 -16
  12. data/lib/mail/core_extensions/string.rb +0 -4
  13. data/lib/mail/elements/address.rb +9 -4
  14. data/lib/mail/elements/address_list.rb +10 -18
  15. data/lib/mail/elements/content_disposition_element.rb +8 -15
  16. data/lib/mail/elements/content_location_element.rb +5 -10
  17. data/lib/mail/elements/content_transfer_encoding_element.rb +5 -10
  18. data/lib/mail/elements/content_type_element.rb +8 -19
  19. data/lib/mail/elements/date_time_element.rb +6 -14
  20. data/lib/mail/elements/envelope_from_element.rb +14 -21
  21. data/lib/mail/elements/message_ids_element.rb +8 -12
  22. data/lib/mail/elements/mime_version_element.rb +6 -14
  23. data/lib/mail/elements/phrase_list.rb +6 -9
  24. data/lib/mail/elements/received_element.rb +9 -15
  25. data/lib/mail/encodings.rb +12 -14
  26. data/lib/mail/field.rb +7 -4
  27. data/lib/mail/fields/common/parameter_hash.rb +1 -1
  28. data/lib/mail/fields/content_type_field.rb +2 -7
  29. data/lib/mail/fields/unstructured_field.rb +2 -2
  30. data/lib/mail/header.rb +1 -0
  31. data/lib/mail/message.rb +23 -25
  32. data/lib/mail/multibyte.rb +51 -0
  33. data/lib/mail/multibyte/chars.rb +27 -27
  34. data/lib/mail/network/delivery_methods/exim.rb +10 -6
  35. data/lib/mail/network/delivery_methods/sendmail.rb +2 -6
  36. data/lib/mail/network/delivery_methods/smtp.rb +14 -6
  37. data/lib/mail/parsers.rb +16 -24
  38. data/lib/mail/parsers/address_lists_parser.rb +15321 -112
  39. data/lib/mail/parsers/address_lists_parser.rl +166 -0
  40. data/lib/mail/parsers/content_disposition_parser.rb +698 -55
  41. data/lib/mail/parsers/content_disposition_parser.rl +76 -0
  42. data/lib/mail/parsers/content_location_parser.rb +565 -23
  43. data/lib/mail/parsers/content_location_parser.rl +65 -0
  44. data/lib/mail/parsers/content_transfer_encoding_parser.rb +410 -22
  45. data/lib/mail/parsers/content_transfer_encoding_parser.rl +58 -0
  46. data/lib/mail/parsers/content_type_parser.rb +841 -54
  47. data/lib/mail/parsers/content_type_parser.rl +77 -0
  48. data/lib/mail/parsers/date_time_parser.rb +773 -26
  49. data/lib/mail/parsers/date_time_parser.rl +56 -0
  50. data/lib/mail/parsers/envelope_from_parser.rb +2051 -36
  51. data/lib/mail/parsers/envelope_from_parser.rl +76 -0
  52. data/lib/mail/parsers/message_ids_parser.rb +1494 -25
  53. data/lib/mail/parsers/message_ids_parser.rl +76 -0
  54. data/lib/mail/parsers/mime_version_parser.rb +393 -26
  55. data/lib/mail/parsers/mime_version_parser.rl +55 -0
  56. data/lib/mail/parsers/phrase_lists_parser.rb +529 -19
  57. data/lib/mail/parsers/phrase_lists_parser.rl +77 -0
  58. data/lib/mail/parsers/received_parser.rb +4711 -38
  59. data/lib/mail/parsers/received_parser.rl +78 -0
  60. data/lib/mail/parsers/rfc2045_content_transfer_encoding.rl +12 -0
  61. data/lib/mail/parsers/rfc2045_content_type.rl +24 -0
  62. data/lib/mail/parsers/rfc2045_mime.rl +15 -0
  63. data/lib/mail/parsers/rfc2183_content_disposition.rl +14 -0
  64. data/lib/mail/parsers/rfc5234_abnf_core_rules.rl +16 -0
  65. data/lib/mail/parsers/rfc5322.rl +57 -0
  66. data/lib/mail/parsers/rfc5322_address.rl +70 -0
  67. data/lib/mail/parsers/{ragel/date_time.rl → rfc5322_date_time.rl} +7 -1
  68. data/lib/mail/parsers/rfc5322_lexical_tokens.rl +56 -0
  69. data/lib/mail/part.rb +1 -1
  70. data/lib/mail/parts_list.rb +5 -6
  71. data/lib/mail/utilities.rb +4 -2
  72. data/lib/mail/version.rb +3 -3
  73. data/lib/mail/version_specific/ruby_1_8.rb +28 -2
  74. data/lib/mail/version_specific/ruby_1_9.rb +48 -8
  75. metadata +28 -45
  76. data/lib/mail/core_extensions/string/access.rb +0 -146
  77. data/lib/mail/core_extensions/string/multibyte.rb +0 -79
  78. data/lib/mail/parsers/ragel.rb +0 -18
  79. data/lib/mail/parsers/ragel/common.rl +0 -185
  80. data/lib/mail/parsers/ragel/parser_info.rb +0 -61
  81. data/lib/mail/parsers/ragel/ruby.rb +0 -40
  82. data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb +0 -14864
  83. data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb.rl +0 -37
  84. data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb +0 -751
  85. data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb.rl +0 -37
  86. data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb +0 -614
  87. data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb.rl +0 -37
  88. data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb +0 -447
  89. data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb.rl +0 -37
  90. data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb +0 -825
  91. data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb.rl +0 -37
  92. data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb +0 -817
  93. data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb.rl +0 -37
  94. data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb +0 -2149
  95. data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb.rl +0 -37
  96. data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb +0 -1570
  97. data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb.rl +0 -37
  98. data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb +0 -440
  99. data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb.rl +0 -37
  100. data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb +0 -564
  101. data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb.rl +0 -37
  102. data/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl +0 -51
  103. data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb +0 -5144
  104. data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb.rl +0 -37
  105. data/lib/mail/parsers/ragel/ruby/parser.rb.rl.erb +0 -37
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+ require 'mail/utilities'
3
+
4
+ %%{
5
+ machine mime_version;
6
+
7
+ # Major Digits
8
+ action major_digits_s { major_digits_s = p }
9
+ action major_digits_e { mime_version.major = data[major_digits_s..(p-1)] }
10
+
11
+ # Minor Digits
12
+ action minor_digits_s { minor_digits_s = p }
13
+ action minor_digits_e { mime_version.minor = data[minor_digits_s..(p-1)] }
14
+
15
+ # No-op actions
16
+ action comment_s {}
17
+ action comment_e {}
18
+ action qstr_s {}
19
+ action qstr_e {}
20
+ action phrase_s {}
21
+ action phrase_e {}
22
+
23
+ include rfc2045_mime "rfc2045_mime.rl";
24
+ main := mime_version;
25
+ }%%
26
+
27
+ module Mail::Parsers
28
+ module MimeVersionParser
29
+ MimeVersionStruct = Struct.new(:major, :minor, :error)
30
+
31
+ %%write data noprefix;
32
+
33
+ def self.parse(data)
34
+ return MimeVersionStruct.new('', nil) if Mail::Utilities.blank?(data)
35
+
36
+ # Parser state
37
+ mime_version = MimeVersionStruct.new
38
+ major_digits_s = minor_digits_s = nil
39
+
40
+ # 5.1 Variables Used by Ragel
41
+ p = 0
42
+ eof = pe = data.length
43
+ stack = []
44
+
45
+ %%write init;
46
+ %%write exec;
47
+
48
+ if p != eof || cs < %%{ write first_final; }%%
49
+ raise Mail::Field::ParseError.new(Mail::MimeVersionElement, data, "Only able to parse up to #{data[0..p]}")
50
+ end
51
+
52
+ mime_version
53
+ end
54
+ end
55
+ end
@@ -1,33 +1,543 @@
1
+
1
2
  # frozen_string_literal: true
3
+ require 'mail/utilities'
4
+
5
+
6
+
7
+
2
8
  module Mail::Parsers
3
9
  class PhraseListsParser
10
+ PhraseListsStruct = Struct.new(:phrases, :error)
4
11
 
5
- def parse(s)
6
- raise Mail::Field::ParseError.new(Mail::PhraseList, s, 'nil is invalid') if s.nil?
12
+
13
+ class << self
14
+ attr_accessor :_trans_keys
15
+ private :_trans_keys, :_trans_keys=
16
+ end
17
+ self._trans_keys = [
18
+ 0, 0, 9, 126, 9, 126,
19
+ 10, 10, 9, 32, 10,
20
+ 10, 9, 32, 1, 127,
21
+ 1, 127, 10, 10, 9, 32,
22
+ 0, 127, 9, 126, 10,
23
+ 10, 9, 32, 9, 126,
24
+ 1, 127, 1, 127, 10, 10,
25
+ 9, 32, 0, 127, 9,
26
+ 126, 9, 126, 9, 126,
27
+ 0, 0, 0
28
+ ]
29
+
30
+ class << self
31
+ attr_accessor :_key_spans
32
+ private :_key_spans, :_key_spans=
33
+ end
34
+ self._key_spans = [
35
+ 0, 118, 118, 1, 24, 1, 24, 127,
36
+ 127, 1, 24, 128, 118, 1, 24, 118,
37
+ 127, 127, 1, 24, 128, 118, 118, 118,
38
+ 0
39
+ ]
40
+
41
+ class << self
42
+ attr_accessor :_index_offsets
43
+ private :_index_offsets, :_index_offsets=
44
+ end
45
+ self._index_offsets = [
46
+ 0, 0, 119, 238, 240, 265, 267, 292,
47
+ 420, 548, 550, 575, 704, 823, 825, 850,
48
+ 969, 1097, 1225, 1227, 1252, 1381, 1500, 1619,
49
+ 1738
50
+ ]
51
+
52
+ class << self
53
+ attr_accessor :_indicies
54
+ private :_indicies, :_indicies=
55
+ end
56
+ self._indicies = [
57
+ 0, 1, 1, 1, 2, 1, 1, 1,
58
+ 1, 1, 1, 1, 1, 1, 1, 1,
59
+ 1, 1, 1, 1, 1, 1, 1, 0,
60
+ 3, 4, 3, 3, 3, 3, 3, 5,
61
+ 1, 3, 3, 1, 3, 6, 3, 3,
62
+ 3, 3, 3, 3, 3, 3, 3, 3,
63
+ 3, 1, 1, 1, 3, 1, 3, 6,
64
+ 3, 3, 3, 3, 3, 3, 3, 3,
65
+ 3, 3, 3, 3, 3, 3, 3, 3,
66
+ 3, 3, 3, 3, 3, 3, 3, 3,
67
+ 3, 3, 1, 1, 1, 3, 3, 3,
68
+ 3, 3, 3, 3, 3, 3, 3, 3,
69
+ 3, 3, 3, 3, 3, 3, 3, 3,
70
+ 3, 3, 3, 3, 3, 3, 3, 3,
71
+ 3, 3, 3, 3, 3, 3, 1, 7,
72
+ 1, 1, 1, 8, 1, 1, 1, 1,
73
+ 1, 1, 1, 1, 1, 1, 1, 1,
74
+ 1, 1, 1, 1, 1, 1, 7, 9,
75
+ 10, 9, 9, 9, 9, 9, 11, 1,
76
+ 9, 9, 1, 9, 1, 9, 9, 9,
77
+ 9, 9, 9, 9, 9, 9, 9, 9,
78
+ 1, 1, 1, 9, 1, 9, 1, 9,
79
+ 9, 9, 9, 9, 9, 9, 9, 9,
80
+ 9, 9, 9, 9, 9, 9, 9, 9,
81
+ 9, 9, 9, 9, 9, 9, 9, 9,
82
+ 9, 1, 1, 1, 9, 9, 9, 9,
83
+ 9, 9, 9, 9, 9, 9, 9, 9,
84
+ 9, 9, 9, 9, 9, 9, 9, 9,
85
+ 9, 9, 9, 9, 9, 9, 9, 9,
86
+ 9, 9, 9, 9, 9, 1, 12, 1,
87
+ 7, 1, 1, 1, 1, 1, 1, 1,
88
+ 1, 1, 1, 1, 1, 1, 1, 1,
89
+ 1, 1, 1, 1, 1, 1, 1, 7,
90
+ 1, 13, 1, 9, 1, 1, 1, 1,
91
+ 1, 1, 1, 1, 1, 1, 1, 1,
92
+ 1, 1, 1, 1, 1, 1, 1, 1,
93
+ 1, 1, 9, 1, 14, 14, 14, 14,
94
+ 14, 14, 14, 14, 14, 1, 14, 14,
95
+ 15, 14, 14, 14, 14, 14, 14, 14,
96
+ 14, 14, 14, 14, 14, 14, 14, 14,
97
+ 14, 14, 14, 14, 14, 16, 14, 14,
98
+ 14, 14, 14, 14, 14, 14, 14, 14,
99
+ 14, 14, 14, 14, 14, 14, 14, 14,
100
+ 14, 14, 14, 14, 14, 14, 14, 14,
101
+ 14, 14, 14, 14, 14, 14, 14, 14,
102
+ 14, 14, 14, 14, 14, 14, 14, 14,
103
+ 14, 14, 14, 14, 14, 14, 14, 14,
104
+ 14, 14, 14, 14, 14, 14, 14, 17,
105
+ 14, 14, 14, 14, 14, 14, 14, 14,
106
+ 14, 14, 14, 14, 14, 14, 14, 14,
107
+ 14, 14, 14, 14, 14, 14, 14, 14,
108
+ 14, 14, 14, 14, 14, 14, 14, 14,
109
+ 14, 14, 14, 1, 18, 18, 18, 18,
110
+ 18, 18, 18, 18, 18, 1, 18, 18,
111
+ 19, 18, 18, 18, 18, 18, 18, 18,
112
+ 18, 18, 18, 18, 18, 18, 18, 18,
113
+ 18, 18, 18, 18, 18, 20, 18, 18,
114
+ 18, 18, 18, 18, 18, 18, 18, 18,
115
+ 18, 18, 18, 18, 18, 18, 18, 18,
116
+ 18, 18, 18, 18, 18, 18, 18, 18,
117
+ 18, 18, 18, 18, 18, 18, 18, 18,
118
+ 18, 18, 18, 18, 18, 18, 18, 18,
119
+ 18, 18, 18, 18, 18, 18, 18, 18,
120
+ 18, 18, 18, 18, 18, 18, 18, 21,
121
+ 18, 18, 18, 18, 18, 18, 18, 18,
122
+ 18, 18, 18, 18, 18, 18, 18, 18,
123
+ 18, 18, 18, 18, 18, 18, 18, 18,
124
+ 18, 18, 18, 18, 18, 18, 18, 18,
125
+ 18, 18, 18, 1, 22, 1, 18, 1,
126
+ 1, 1, 1, 1, 1, 1, 1, 1,
127
+ 1, 1, 1, 1, 1, 1, 1, 1,
128
+ 1, 1, 1, 1, 1, 18, 1, 18,
129
+ 18, 18, 18, 18, 18, 18, 18, 18,
130
+ 18, 18, 18, 18, 18, 18, 18, 18,
131
+ 18, 18, 18, 18, 18, 18, 18, 18,
132
+ 18, 18, 18, 18, 18, 18, 18, 18,
133
+ 18, 18, 18, 18, 18, 18, 18, 18,
134
+ 18, 18, 18, 18, 18, 18, 18, 18,
135
+ 18, 18, 18, 18, 18, 18, 18, 18,
136
+ 18, 18, 18, 18, 18, 18, 18, 18,
137
+ 18, 18, 18, 18, 18, 18, 18, 18,
138
+ 18, 18, 18, 18, 18, 18, 18, 18,
139
+ 18, 18, 18, 18, 18, 18, 18, 18,
140
+ 18, 18, 18, 18, 18, 18, 18, 18,
141
+ 18, 18, 18, 18, 18, 18, 18, 18,
142
+ 18, 18, 18, 18, 18, 18, 18, 18,
143
+ 18, 18, 18, 18, 18, 18, 18, 18,
144
+ 18, 18, 18, 18, 18, 18, 18, 1,
145
+ 23, 1, 1, 1, 24, 1, 1, 1,
146
+ 1, 1, 1, 1, 1, 1, 1, 1,
147
+ 1, 1, 1, 1, 1, 1, 1, 23,
148
+ 3, 4, 3, 3, 3, 3, 3, 5,
149
+ 1, 3, 3, 1, 3, 6, 3, 3,
150
+ 3, 3, 3, 3, 3, 3, 3, 3,
151
+ 3, 1, 1, 1, 3, 1, 3, 6,
152
+ 3, 3, 3, 3, 3, 3, 3, 3,
153
+ 3, 3, 3, 3, 3, 3, 3, 3,
154
+ 3, 3, 3, 3, 3, 3, 3, 3,
155
+ 3, 3, 1, 1, 1, 3, 3, 3,
156
+ 3, 3, 3, 3, 3, 3, 3, 3,
157
+ 3, 3, 3, 3, 3, 3, 3, 3,
158
+ 3, 3, 3, 3, 3, 3, 3, 3,
159
+ 3, 3, 3, 3, 3, 3, 1, 25,
160
+ 1, 26, 1, 1, 1, 1, 1, 1,
161
+ 1, 1, 1, 1, 1, 1, 1, 1,
162
+ 1, 1, 1, 1, 1, 1, 1, 1,
163
+ 26, 1, 27, 1, 1, 1, 28, 1,
164
+ 1, 1, 1, 1, 1, 1, 1, 1,
165
+ 1, 1, 1, 1, 1, 1, 1, 1,
166
+ 1, 27, 29, 30, 29, 29, 29, 29,
167
+ 29, 31, 1, 29, 29, 1, 29, 1,
168
+ 29, 29, 29, 29, 29, 29, 29, 29,
169
+ 29, 29, 29, 1, 1, 1, 29, 1,
170
+ 29, 1, 29, 29, 29, 29, 29, 29,
171
+ 29, 29, 29, 29, 29, 29, 29, 29,
172
+ 29, 29, 29, 29, 29, 29, 29, 29,
173
+ 29, 29, 29, 29, 1, 1, 1, 29,
174
+ 29, 29, 29, 29, 29, 29, 29, 29,
175
+ 29, 29, 29, 29, 29, 29, 29, 29,
176
+ 29, 29, 29, 29, 29, 29, 29, 29,
177
+ 29, 29, 29, 29, 29, 29, 29, 29,
178
+ 1, 32, 32, 32, 32, 32, 32, 32,
179
+ 32, 32, 1, 32, 32, 33, 32, 32,
180
+ 32, 32, 32, 32, 32, 32, 32, 32,
181
+ 32, 32, 32, 32, 32, 32, 32, 32,
182
+ 32, 32, 32, 32, 32, 32, 32, 32,
183
+ 34, 35, 32, 32, 32, 32, 32, 32,
184
+ 32, 32, 32, 32, 32, 32, 32, 32,
185
+ 32, 32, 32, 32, 32, 32, 32, 32,
186
+ 32, 32, 32, 32, 32, 32, 32, 32,
187
+ 32, 32, 32, 32, 32, 32, 32, 32,
188
+ 32, 32, 32, 32, 32, 32, 32, 32,
189
+ 32, 32, 32, 32, 36, 32, 32, 32,
190
+ 32, 32, 32, 32, 32, 32, 32, 32,
191
+ 32, 32, 32, 32, 32, 32, 32, 32,
192
+ 32, 32, 32, 32, 32, 32, 32, 32,
193
+ 32, 32, 32, 32, 32, 32, 32, 32,
194
+ 1, 37, 37, 37, 37, 37, 37, 37,
195
+ 37, 37, 1, 37, 37, 38, 37, 37,
196
+ 37, 37, 37, 37, 37, 37, 37, 37,
197
+ 37, 37, 37, 37, 37, 37, 37, 37,
198
+ 37, 37, 37, 37, 37, 37, 37, 37,
199
+ 39, 40, 37, 37, 37, 37, 37, 37,
200
+ 37, 37, 37, 37, 37, 37, 37, 37,
201
+ 37, 37, 37, 37, 37, 37, 37, 37,
202
+ 37, 37, 37, 37, 37, 37, 37, 37,
203
+ 37, 37, 37, 37, 37, 37, 37, 37,
204
+ 37, 37, 37, 37, 37, 37, 37, 37,
205
+ 37, 37, 37, 37, 41, 37, 37, 37,
206
+ 37, 37, 37, 37, 37, 37, 37, 37,
207
+ 37, 37, 37, 37, 37, 37, 37, 37,
208
+ 37, 37, 37, 37, 37, 37, 37, 37,
209
+ 37, 37, 37, 37, 37, 37, 37, 37,
210
+ 1, 42, 1, 37, 1, 1, 1, 1,
211
+ 1, 1, 1, 1, 1, 1, 1, 1,
212
+ 1, 1, 1, 1, 1, 1, 1, 1,
213
+ 1, 1, 37, 1, 37, 37, 37, 37,
214
+ 37, 37, 37, 37, 37, 37, 37, 37,
215
+ 37, 37, 37, 37, 37, 37, 37, 37,
216
+ 37, 37, 37, 37, 37, 37, 37, 37,
217
+ 37, 37, 37, 37, 37, 37, 37, 37,
218
+ 37, 37, 37, 37, 37, 37, 37, 37,
219
+ 37, 37, 37, 37, 37, 37, 37, 37,
220
+ 37, 37, 37, 37, 37, 37, 37, 37,
221
+ 37, 37, 37, 37, 37, 37, 37, 37,
222
+ 37, 37, 37, 37, 37, 37, 37, 37,
223
+ 37, 37, 37, 37, 37, 37, 37, 37,
224
+ 37, 37, 37, 37, 37, 37, 37, 37,
225
+ 37, 37, 37, 37, 37, 37, 37, 37,
226
+ 37, 37, 37, 37, 37, 37, 37, 37,
227
+ 37, 37, 37, 37, 37, 37, 37, 37,
228
+ 37, 37, 37, 37, 37, 37, 37, 37,
229
+ 37, 37, 37, 37, 1, 9, 1, 1,
230
+ 1, 43, 1, 1, 1, 1, 1, 1,
231
+ 1, 1, 1, 1, 1, 1, 1, 1,
232
+ 1, 1, 1, 1, 9, 9, 10, 9,
233
+ 9, 9, 9, 9, 44, 1, 9, 9,
234
+ 45, 9, 46, 9, 9, 9, 9, 9,
235
+ 9, 9, 9, 9, 9, 9, 1, 1,
236
+ 1, 9, 1, 9, 46, 9, 9, 9,
237
+ 9, 9, 9, 9, 9, 9, 9, 9,
238
+ 9, 9, 9, 9, 9, 9, 9, 9,
239
+ 9, 9, 9, 9, 9, 9, 9, 1,
240
+ 1, 1, 9, 9, 9, 9, 9, 9,
241
+ 9, 9, 9, 9, 9, 9, 9, 9,
242
+ 9, 9, 9, 9, 9, 9, 9, 9,
243
+ 9, 9, 9, 9, 9, 9, 9, 9,
244
+ 9, 9, 9, 1, 29, 1, 1, 1,
245
+ 47, 1, 1, 1, 1, 1, 1, 1,
246
+ 1, 1, 1, 1, 1, 1, 1, 1,
247
+ 1, 1, 1, 29, 29, 30, 29, 29,
248
+ 29, 29, 29, 48, 1, 29, 29, 49,
249
+ 29, 50, 29, 29, 29, 29, 29, 29,
250
+ 29, 29, 29, 29, 29, 1, 1, 1,
251
+ 29, 1, 29, 50, 29, 29, 29, 29,
252
+ 29, 29, 29, 29, 29, 29, 29, 29,
253
+ 29, 29, 29, 29, 29, 29, 29, 29,
254
+ 29, 29, 29, 29, 29, 29, 1, 1,
255
+ 1, 29, 29, 29, 29, 29, 29, 29,
256
+ 29, 29, 29, 29, 29, 29, 29, 29,
257
+ 29, 29, 29, 29, 29, 29, 29, 29,
258
+ 29, 29, 29, 29, 29, 29, 29, 29,
259
+ 29, 29, 1, 7, 1, 1, 1, 8,
260
+ 1, 1, 1, 1, 1, 1, 1, 1,
261
+ 1, 1, 1, 1, 1, 1, 1, 1,
262
+ 1, 1, 7, 9, 10, 9, 9, 9,
263
+ 9, 9, 11, 1, 9, 9, 45, 9,
264
+ 46, 9, 9, 9, 9, 9, 9, 9,
265
+ 9, 9, 9, 9, 1, 1, 1, 9,
266
+ 1, 9, 46, 9, 9, 9, 9, 9,
267
+ 9, 9, 9, 9, 9, 9, 9, 9,
268
+ 9, 9, 9, 9, 9, 9, 9, 9,
269
+ 9, 9, 9, 9, 9, 1, 1, 1,
270
+ 9, 9, 9, 9, 9, 9, 9, 9,
271
+ 9, 9, 9, 9, 9, 9, 9, 9,
272
+ 9, 9, 9, 9, 9, 9, 9, 9,
273
+ 9, 9, 9, 9, 9, 9, 9, 9,
274
+ 9, 1, 1, 0
275
+ ]
276
+
277
+ class << self
278
+ attr_accessor :_trans_targs
279
+ private :_trans_targs, :_trans_targs=
280
+ end
281
+ self._trans_targs = [
282
+ 2, 0, 3, 21, 7, 15, 23, 2,
283
+ 3, 21, 7, 15, 4, 6, 8, 9,
284
+ 21, 11, 8, 9, 21, 11, 10, 12,
285
+ 13, 14, 12, 2, 3, 21, 7, 15,
286
+ 17, 18, 17, 24, 20, 17, 18, 17,
287
+ 24, 20, 19, 5, 22, 12, 23, 5,
288
+ 22, 12, 23
289
+ ]
290
+
291
+ class << self
292
+ attr_accessor :_trans_actions
293
+ private :_trans_actions, :_trans_actions=
294
+ end
295
+ self._trans_actions = [
296
+ 1, 0, 1, 1, 1, 2, 1, 0,
297
+ 0, 0, 0, 3, 0, 0, 4, 4,
298
+ 5, 4, 0, 0, 6, 0, 0, 1,
299
+ 1, 0, 0, 7, 7, 7, 7, 8,
300
+ 9, 9, 10, 11, 9, 0, 0, 3,
301
+ 12, 0, 0, 0, 3, 13, 0, 7,
302
+ 8, 14, 7
303
+ ]
304
+
305
+ class << self
306
+ attr_accessor :_eof_actions
307
+ private :_eof_actions, :_eof_actions=
308
+ end
309
+ self._eof_actions = [
310
+ 0, 0, 0, 0, 0, 0, 0, 0,
311
+ 0, 0, 0, 0, 0, 0, 0, 0,
312
+ 0, 0, 0, 0, 0, 13, 14, 13,
313
+ 0
314
+ ]
315
+
316
+ class << self
317
+ attr_accessor :start
318
+ end
319
+ self.start = 1;
320
+ class << self
321
+ attr_accessor :first_final
322
+ end
323
+ self.first_final = 21;
324
+ class << self
325
+ attr_accessor :error
326
+ end
327
+ self.error = 0;
328
+
329
+ class << self
330
+ attr_accessor :en_comment_tail
331
+ end
332
+ self.en_comment_tail = 16;
333
+ class << self
334
+ attr_accessor :en_main
335
+ end
336
+ self.en_main = 1;
7
337
 
8
- actions, error = Ragel.parse(:phrase_lists, s)
9
- if error
10
- raise Mail::Field::ParseError.new(Mail::PhraseList, s, error)
11
- end
12
338
 
13
- phrase_lists = PhraseListsStruct.new([])
14
339
 
340
+ def self.parse(data)
341
+ raise Mail::Field::ParseError.new(Mail::PhraseList, data, 'nil is invalid') if data.nil?
342
+
343
+ # Parser state
344
+ phrase_lists = PhraseListsStruct.new([])
15
345
  phrase_s = nil
16
- actions.each_slice(2) do |action_id, p|
17
- action = Mail::Parsers::Ragel::ACTIONS[action_id]
18
- case action
19
346
 
20
- # Phrase
21
- when :phrase_s then phrase_s = p
22
- when :phrase_e
23
- phrase_lists.phrases << s[phrase_s..(p-1)] if phrase_s
24
- phrase_s = nil
347
+ # 5.1 Variables Used by Ragel
348
+ p = 0
349
+ eof = pe = data.length
350
+ stack = []
351
+
352
+
353
+ begin
354
+ p ||= 0
355
+ pe ||= data.length
356
+ cs = start
357
+ top = 0
358
+ end
359
+
360
+
361
+ begin
362
+ testEof = false
363
+ _slen, _trans, _keys, _inds, _acts, _nacts = nil
364
+ _goto_level = 0
365
+ _resume = 10
366
+ _eof_trans = 15
367
+ _again = 20
368
+ _test_eof = 30
369
+ _out = 40
370
+ while true
371
+ if _goto_level <= 0
372
+ if p == pe
373
+ _goto_level = _test_eof
374
+ next
375
+ end
376
+ if cs == 0
377
+ _goto_level = _out
378
+ next
379
+ end
380
+ end
381
+ if _goto_level <= _resume
382
+ _keys = cs << 1
383
+ _inds = _index_offsets[cs]
384
+ _slen = _key_spans[cs]
385
+ _wide = data[p].ord
386
+ _trans = if ( _slen > 0 &&
387
+ _trans_keys[_keys] <= _wide &&
388
+ _wide <= _trans_keys[_keys + 1]
389
+ ) then
390
+ _indicies[ _inds + _wide - _trans_keys[_keys] ]
391
+ else
392
+ _indicies[ _inds + _slen ]
393
+ end
394
+ cs = _trans_targs[_trans]
395
+ if _trans_actions[_trans] != 0
396
+ case _trans_actions[_trans]
397
+ when 1 then
398
+ begin
399
+ phrase_s = p end
400
+ when 13 then
401
+ begin
402
+
403
+ phrase_lists.phrases << data[phrase_s..(p-1)] if phrase_s
404
+ phrase_s = nil
405
+ end
406
+ when 7 then
407
+ begin
408
+ end
409
+ when 9 then
410
+ begin
411
+ end
412
+ when 6 then
413
+ begin
414
+ end
415
+ when 4 then
416
+ begin
417
+ end
418
+ when 3 then
419
+ begin
420
+ begin
421
+ stack[top] = cs
422
+ top+= 1
423
+ cs = 16
424
+ _goto_level = _again
425
+ next
426
+ end
427
+ end
428
+ when 12 then
429
+ begin
430
+ begin
431
+ top -= 1
432
+ cs = stack[top]
433
+ _goto_level = _again
434
+ next
435
+ end
436
+ end
437
+ when 2 then
438
+ begin
439
+ phrase_s = p end
440
+ begin
441
+ begin
442
+ stack[top] = cs
443
+ top+= 1
444
+ cs = 16
445
+ _goto_level = _again
446
+ next
447
+ end
448
+ end
449
+ when 14 then
450
+ begin
451
+ end
452
+ begin
453
+
454
+ phrase_lists.phrases << data[phrase_s..(p-1)] if phrase_s
455
+ phrase_s = nil
456
+ end
457
+ when 8 then
458
+ begin
459
+ end
460
+ begin
461
+ begin
462
+ stack[top] = cs
463
+ top+= 1
464
+ cs = 16
465
+ _goto_level = _again
466
+ next
467
+ end
468
+ end
469
+ when 10 then
470
+ begin
471
+ end
472
+ begin
473
+ begin
474
+ stack[top] = cs
475
+ top+= 1
476
+ cs = 16
477
+ _goto_level = _again
478
+ next
479
+ end
480
+ end
481
+ when 11 then
482
+ begin
483
+ end
484
+ begin
485
+ begin
486
+ top -= 1
487
+ cs = stack[top]
488
+ _goto_level = _again
489
+ next
490
+ end
491
+ end
492
+ when 5 then
493
+ begin
494
+ end
495
+ begin
496
+ end
497
+ end
498
+ end
499
+ end
500
+ if _goto_level <= _again
501
+ if cs == 0
502
+ _goto_level = _out
503
+ next
504
+ end
505
+ p += 1
506
+ if p != pe
507
+ _goto_level = _resume
508
+ next
509
+ end
510
+ end
511
+ if _goto_level <= _test_eof
512
+ if p == eof
513
+ case _eof_actions[cs]
514
+ when 13 then
515
+ begin
516
+
517
+ phrase_lists.phrases << data[phrase_s..(p-1)] if phrase_s
518
+ phrase_s = nil
519
+ end
520
+ when 14 then
521
+ begin
522
+ end
523
+ begin
524
+
525
+ phrase_lists.phrases << data[phrase_s..(p-1)] if phrase_s
526
+ phrase_s = nil
527
+ end
528
+ end
529
+ end
530
+
531
+ end
532
+ if _goto_level <= _out
533
+ break
534
+ end
535
+ end
536
+ end
25
537
 
26
- when :comment_e, :comment_s, :qstr_s, :qstr_e then nil
27
538
 
28
- else
29
- raise Mail::Field::ParseError.new(Mail::PhraseList, s, "Failed to process unknown action: #{action}")
30
- end
539
+ if p != eof || cs < 21
540
+ raise Mail::Field::ParseError.new(Mail::PhraseListsElement, data, "Only able to parse up to #{data[0..p]}")
31
541
  end
32
542
 
33
543
  phrase_lists