mail 2.6.4 → 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 (109) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.rdoc +35 -0
  3. data/Dependencies.txt +0 -1
  4. data/Gemfile +7 -7
  5. data/README.md +8 -5
  6. data/Rakefile +0 -6
  7. data/lib/mail/attachments_list.rb +4 -3
  8. data/lib/mail/body.rb +3 -3
  9. data/lib/mail/check_delivery_params.rb +47 -10
  10. data/lib/mail/core_extensions/smtp.rb +19 -16
  11. data/lib/mail/core_extensions/string.rb +0 -4
  12. data/lib/mail/elements/address.rb +18 -8
  13. data/lib/mail/elements/address_list.rb +10 -18
  14. data/lib/mail/elements/content_disposition_element.rb +8 -15
  15. data/lib/mail/elements/content_location_element.rb +5 -10
  16. data/lib/mail/elements/content_transfer_encoding_element.rb +5 -10
  17. data/lib/mail/elements/content_type_element.rb +8 -19
  18. data/lib/mail/elements/date_time_element.rb +6 -14
  19. data/lib/mail/elements/envelope_from_element.rb +14 -21
  20. data/lib/mail/elements/message_ids_element.rb +8 -12
  21. data/lib/mail/elements/mime_version_element.rb +6 -14
  22. data/lib/mail/elements/phrase_list.rb +6 -9
  23. data/lib/mail/elements/received_element.rb +9 -15
  24. data/lib/mail/encodings.rb +12 -14
  25. data/lib/mail/field.rb +7 -4
  26. data/lib/mail/fields/common/address_container.rb +2 -2
  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/chars.rb +29 -29
  33. data/lib/mail/multibyte.rb +51 -0
  34. data/lib/mail/network/delivery_methods/file_delivery.rb +4 -8
  35. data/lib/mail/network/delivery_methods/sendmail.rb +2 -4
  36. data/lib/mail/network/delivery_methods/smtp.rb +16 -11
  37. data/lib/mail/network/delivery_methods/smtp_connection.rb +2 -6
  38. data/lib/mail/network/delivery_methods/test_mailer.rb +5 -8
  39. data/lib/mail/network/retriever_methods/test_retriever.rb +1 -1
  40. data/lib/mail/parsers/address_lists_parser.rb +15321 -112
  41. data/lib/mail/parsers/address_lists_parser.rl +166 -0
  42. data/lib/mail/parsers/content_disposition_parser.rb +698 -55
  43. data/lib/mail/parsers/content_disposition_parser.rl +76 -0
  44. data/lib/mail/parsers/content_location_parser.rb +565 -23
  45. data/lib/mail/parsers/content_location_parser.rl +65 -0
  46. data/lib/mail/parsers/content_transfer_encoding_parser.rb +410 -22
  47. data/lib/mail/parsers/content_transfer_encoding_parser.rl +58 -0
  48. data/lib/mail/parsers/content_type_parser.rb +841 -54
  49. data/lib/mail/parsers/content_type_parser.rl +77 -0
  50. data/lib/mail/parsers/date_time_parser.rb +773 -26
  51. data/lib/mail/parsers/date_time_parser.rl +56 -0
  52. data/lib/mail/parsers/envelope_from_parser.rb +2051 -36
  53. data/lib/mail/parsers/envelope_from_parser.rl +76 -0
  54. data/lib/mail/parsers/message_ids_parser.rb +1494 -25
  55. data/lib/mail/parsers/message_ids_parser.rl +76 -0
  56. data/lib/mail/parsers/mime_version_parser.rb +393 -26
  57. data/lib/mail/parsers/mime_version_parser.rl +55 -0
  58. data/lib/mail/parsers/phrase_lists_parser.rb +529 -19
  59. data/lib/mail/parsers/phrase_lists_parser.rl +77 -0
  60. data/lib/mail/parsers/received_parser.rb +4711 -38
  61. data/lib/mail/parsers/received_parser.rl +78 -0
  62. data/lib/mail/parsers/rfc2045_content_transfer_encoding.rl +12 -0
  63. data/lib/mail/parsers/rfc2045_content_type.rl +24 -0
  64. data/lib/mail/parsers/rfc2045_mime.rl +15 -0
  65. data/lib/mail/parsers/rfc2183_content_disposition.rl +14 -0
  66. data/lib/mail/parsers/rfc5234_abnf_core_rules.rl +16 -0
  67. data/lib/mail/parsers/rfc5322.rl +57 -0
  68. data/lib/mail/parsers/rfc5322_address.rl +70 -0
  69. data/lib/mail/parsers/{ragel/date_time.rl → rfc5322_date_time.rl} +7 -1
  70. data/lib/mail/parsers/rfc5322_lexical_tokens.rl +56 -0
  71. data/lib/mail/parsers.rb +16 -24
  72. data/lib/mail/part.rb +1 -1
  73. data/lib/mail/parts_list.rb +5 -6
  74. data/lib/mail/utilities.rb +19 -3
  75. data/lib/mail/version.rb +3 -3
  76. data/lib/mail/version_specific/ruby_1_8.rb +28 -2
  77. data/lib/mail/version_specific/ruby_1_9.rb +51 -8
  78. data/lib/mail.rb +2 -10
  79. metadata +28 -45
  80. data/lib/mail/core_extensions/string/access.rb +0 -146
  81. data/lib/mail/core_extensions/string/multibyte.rb +0 -79
  82. data/lib/mail/parsers/ragel/common.rl +0 -185
  83. data/lib/mail/parsers/ragel/parser_info.rb +0 -61
  84. data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb +0 -14864
  85. data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb.rl +0 -37
  86. data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb +0 -751
  87. data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb.rl +0 -37
  88. data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb +0 -614
  89. data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb.rl +0 -37
  90. data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb +0 -447
  91. data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb.rl +0 -37
  92. data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb +0 -825
  93. data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb.rl +0 -37
  94. data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb +0 -817
  95. data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb.rl +0 -37
  96. data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb +0 -2149
  97. data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb.rl +0 -37
  98. data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb +0 -1570
  99. data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb.rl +0 -37
  100. data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb +0 -440
  101. data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb.rl +0 -37
  102. data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb +0 -564
  103. data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb.rl +0 -37
  104. data/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl +0 -51
  105. data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb +0 -5144
  106. data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb.rl +0 -37
  107. data/lib/mail/parsers/ragel/ruby/parser.rb.rl.erb +0 -37
  108. data/lib/mail/parsers/ragel/ruby.rb +0 -40
  109. data/lib/mail/parsers/ragel.rb +0 -18
@@ -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
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+ require 'mail/utilities'
3
+
4
+ %%{
5
+ machine date_time;
6
+
7
+ # Phrase
8
+ action phrase_s { phrase_s = p }
9
+ action phrase_e {
10
+ phrase_lists.phrases << data[phrase_s..(p-1)] if phrase_s
11
+ phrase_s = nil
12
+ }
13
+
14
+ # No-op actions
15
+ action address_s {}
16
+ action address_e {}
17
+ action angle_addr_s {}
18
+ action ctime_date_s {}
19
+ action ctime_date_e {}
20
+ action comment_e {}
21
+ action comment_s {}
22
+ action domain_e {}
23
+ action domain_s {}
24
+ action local_dot_atom_e {}
25
+ action local_dot_atom_pre_comment_e {}
26
+ action local_dot_atom_pre_comment_s {}
27
+ action local_dot_atom_s {}
28
+ action qstr_e {}
29
+ action qstr_s {}
30
+ action date_s {}
31
+ action date_e {}
32
+ action time_s {}
33
+ action time_e {}
34
+ action local_quoted_string_s {}
35
+ action local_quoted_string_e {}
36
+ action obs_domain_list_s {}
37
+ action obs_domain_list_e {}
38
+ action group_name_s {}
39
+ action group_name_e {}
40
+ action msg_id_s {}
41
+ action msg_id_e {}
42
+ action received_tokens_s {}
43
+ action received_tokens_e {}
44
+
45
+ include rfc5322 "rfc5322.rl";
46
+ main := phrase_lists;
47
+ }%%
48
+
49
+ module Mail::Parsers
50
+ class PhraseListsParser
51
+ PhraseListsStruct = Struct.new(:phrases, :error)
52
+
53
+ %%write data noprefix;
54
+
55
+ def self.parse(data)
56
+ raise Mail::Field::ParseError.new(Mail::PhraseList, data, 'nil is invalid') if data.nil?
57
+
58
+ # Parser state
59
+ phrase_lists = PhraseListsStruct.new([])
60
+ phrase_s = nil
61
+
62
+ # 5.1 Variables Used by Ragel
63
+ p = 0
64
+ eof = pe = data.length
65
+ stack = []
66
+
67
+ %%write init;
68
+ %%write exec;
69
+
70
+ if p != eof || cs < %%{ write first_final; }%%
71
+ raise Mail::Field::ParseError.new(Mail::PhraseListsElement, data, "Only able to parse up to #{data[0..p]}")
72
+ end
73
+
74
+ phrase_lists
75
+ end
76
+ end
77
+ end