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,76 @@
1
+ # frozen_string_literal: true
2
+ require 'mail/utilities'
3
+
4
+ %%{
5
+ # RFC 5322 Section 3.6.4: Identification Fields
6
+ # https://tools.ietf.org/html/rfc5322#section-3.6.4
7
+ machine message_ids;
8
+
9
+ # Message Ids
10
+ action msg_id_s { msg_id_s = p }
11
+ action msg_id_e { message_ids.message_ids << data[msg_id_s..(p-1)].rstrip }
12
+
13
+ # No-op actions
14
+ action angle_addr_s {}
15
+ action address_s {}
16
+ action address_e {}
17
+ action comment_e {}
18
+ action comment_s {}
19
+ action domain_e {}
20
+ action domain_s {}
21
+ action local_dot_atom_e {}
22
+ action local_dot_atom_pre_comment_e {}
23
+ action local_dot_atom_pre_comment_s {}
24
+ action local_dot_atom_s {}
25
+ action phrase_s {}
26
+ action phrase_e {}
27
+ action qstr_e {}
28
+ action qstr_s {}
29
+ action ctime_date_s {}
30
+ action ctime_date_e {}
31
+ action date_s {}
32
+ action date_e {}
33
+ action time_s {}
34
+ action time_e {}
35
+ action local_quoted_string_s {}
36
+ action local_quoted_string_e {}
37
+ action obs_domain_list_s {}
38
+ action obs_domain_list_e {}
39
+ action group_name_s {}
40
+ action group_name_e {}
41
+ action received_tokens_s {}
42
+ action received_tokens_e {}
43
+
44
+ include rfc5322 "rfc5322.rl";
45
+ main := message_ids;
46
+ }%%
47
+
48
+ module Mail::Parsers
49
+ module MessageIdsParser
50
+ MessageIdsStruct = Struct.new(:message_ids, :error)
51
+
52
+ %%write data noprefix;
53
+
54
+ def self.parse(data)
55
+ raise Mail::Field::ParseError.new(Mail::MessageIdsElement, data, 'nil is invalid') if data.nil?
56
+
57
+ # Parser state
58
+ message_ids = MessageIdsStruct.new([])
59
+ msg_id_s = nil
60
+
61
+ # 5.1 Variables Used by Ragel
62
+ p = 0
63
+ eof = pe = data.length
64
+ stack = []
65
+
66
+ %%write init;
67
+ %%write exec;
68
+
69
+ if p != eof || cs < %%{ write first_final; }%%
70
+ raise Mail::Field::ParseError.new(Mail::MessageIdsElement, data, "Only able to parse up to #{data[0..p]}")
71
+ end
72
+
73
+ message_ids
74
+ end
75
+ end
76
+ end
@@ -1,41 +1,408 @@
1
+
1
2
  # frozen_string_literal: true
3
+ require 'mail/utilities'
4
+
5
+
6
+
7
+
2
8
  module Mail::Parsers
3
- class MimeVersionParser
4
- include Mail::Utilities
9
+ module MimeVersionParser
10
+ MimeVersionStruct = Struct.new(:major, :minor, :error)
5
11
 
6
- def parse(s)
7
- if Mail::Utilities.blank?(s)
8
- return MimeVersionStruct.new("", nil)
9
- end
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, 57, 10, 10,
19
+ 9, 32, 9, 57, 40,
20
+ 57, 46, 46, 40, 57,
21
+ 48, 57, 10, 10, 9, 32,
22
+ 1, 127, 1, 127, 10,
23
+ 10, 9, 32, 0, 127,
24
+ 9, 57, 9, 40, 9, 40,
25
+ 0, 0, 0
26
+ ]
10
27
 
11
- mime_version = MimeVersionStruct.new
28
+ class << self
29
+ attr_accessor :_key_spans
30
+ private :_key_spans, :_key_spans=
31
+ end
32
+ self._key_spans = [
33
+ 0, 49, 1, 24, 49, 18, 1, 18,
34
+ 10, 1, 24, 127, 127, 1, 24, 128,
35
+ 49, 32, 32, 0
36
+ ]
12
37
 
13
- actions, error = Ragel.parse(:mime_version, s)
14
- if error
15
- raise Mail::Field::ParseError.new(Mail::MimeVersionElement, s, error)
16
- end
38
+ class << self
39
+ attr_accessor :_index_offsets
40
+ private :_index_offsets, :_index_offsets=
41
+ end
42
+ self._index_offsets = [
43
+ 0, 0, 50, 52, 77, 127, 146, 148,
44
+ 167, 178, 180, 205, 333, 461, 463, 488,
45
+ 617, 667, 700, 733
46
+ ]
17
47
 
48
+ class << self
49
+ attr_accessor :_indicies
50
+ private :_indicies, :_indicies=
51
+ end
52
+ self._indicies = [
53
+ 0, 1, 1, 1, 2, 1, 1, 1,
54
+ 1, 1, 1, 1, 1, 1, 1, 1,
55
+ 1, 1, 1, 1, 1, 1, 1, 0,
56
+ 1, 1, 1, 1, 1, 1, 1, 3,
57
+ 1, 1, 1, 1, 1, 1, 1, 4,
58
+ 4, 4, 4, 4, 4, 4, 4, 4,
59
+ 4, 1, 5, 1, 0, 1, 1, 1,
60
+ 1, 1, 1, 1, 1, 1, 1, 1,
61
+ 1, 1, 1, 1, 1, 1, 1, 1,
62
+ 1, 1, 1, 0, 1, 6, 1, 1,
63
+ 1, 7, 1, 1, 1, 1, 1, 1,
64
+ 1, 1, 1, 1, 1, 1, 1, 1,
65
+ 1, 1, 1, 1, 6, 1, 1, 1,
66
+ 1, 1, 1, 1, 8, 1, 1, 1,
67
+ 1, 1, 1, 1, 9, 9, 9, 9,
68
+ 9, 9, 9, 9, 9, 9, 1, 10,
69
+ 1, 1, 1, 1, 1, 11, 1, 12,
70
+ 12, 12, 12, 12, 12, 12, 12, 12,
71
+ 12, 1, 13, 1, 14, 1, 1, 1,
72
+ 1, 1, 1, 1, 15, 15, 15, 15,
73
+ 15, 15, 15, 15, 15, 15, 1, 16,
74
+ 16, 16, 16, 16, 16, 16, 16, 16,
75
+ 16, 1, 17, 1, 18, 1, 1, 1,
76
+ 1, 1, 1, 1, 1, 1, 1, 1,
77
+ 1, 1, 1, 1, 1, 1, 1, 1,
78
+ 1, 1, 1, 18, 1, 19, 19, 19,
79
+ 19, 19, 19, 19, 19, 19, 1, 19,
80
+ 19, 20, 19, 19, 19, 19, 19, 19,
81
+ 19, 19, 19, 19, 19, 19, 19, 19,
82
+ 19, 19, 19, 19, 19, 19, 19, 19,
83
+ 19, 19, 19, 19, 21, 22, 19, 19,
84
+ 19, 19, 19, 19, 19, 19, 19, 19,
85
+ 19, 19, 19, 19, 19, 19, 19, 19,
86
+ 19, 19, 19, 19, 19, 19, 19, 19,
87
+ 19, 19, 19, 19, 19, 19, 19, 19,
88
+ 19, 19, 19, 19, 19, 19, 19, 19,
89
+ 19, 19, 19, 19, 19, 19, 19, 19,
90
+ 23, 19, 19, 19, 19, 19, 19, 19,
91
+ 19, 19, 19, 19, 19, 19, 19, 19,
92
+ 19, 19, 19, 19, 19, 19, 19, 19,
93
+ 19, 19, 19, 19, 19, 19, 19, 19,
94
+ 19, 19, 19, 19, 1, 24, 24, 24,
95
+ 24, 24, 24, 24, 24, 24, 1, 24,
96
+ 24, 25, 24, 24, 24, 24, 24, 24,
97
+ 24, 24, 24, 24, 24, 24, 24, 24,
98
+ 24, 24, 24, 24, 24, 24, 24, 24,
99
+ 24, 24, 24, 24, 26, 27, 24, 24,
100
+ 24, 24, 24, 24, 24, 24, 24, 24,
101
+ 24, 24, 24, 24, 24, 24, 24, 24,
102
+ 24, 24, 24, 24, 24, 24, 24, 24,
103
+ 24, 24, 24, 24, 24, 24, 24, 24,
104
+ 24, 24, 24, 24, 24, 24, 24, 24,
105
+ 24, 24, 24, 24, 24, 24, 24, 24,
106
+ 28, 24, 24, 24, 24, 24, 24, 24,
107
+ 24, 24, 24, 24, 24, 24, 24, 24,
108
+ 24, 24, 24, 24, 24, 24, 24, 24,
109
+ 24, 24, 24, 24, 24, 24, 24, 24,
110
+ 24, 24, 24, 24, 1, 29, 1, 24,
111
+ 1, 1, 1, 1, 1, 1, 1, 1,
112
+ 1, 1, 1, 1, 1, 1, 1, 1,
113
+ 1, 1, 1, 1, 1, 1, 24, 1,
114
+ 24, 24, 24, 24, 24, 24, 24, 24,
115
+ 24, 24, 24, 24, 24, 24, 24, 24,
116
+ 24, 24, 24, 24, 24, 24, 24, 24,
117
+ 24, 24, 24, 24, 24, 24, 24, 24,
118
+ 24, 24, 24, 24, 24, 24, 24, 24,
119
+ 24, 24, 24, 24, 24, 24, 24, 24,
120
+ 24, 24, 24, 24, 24, 24, 24, 24,
121
+ 24, 24, 24, 24, 24, 24, 24, 24,
122
+ 24, 24, 24, 24, 24, 24, 24, 24,
123
+ 24, 24, 24, 24, 24, 24, 24, 24,
124
+ 24, 24, 24, 24, 24, 24, 24, 24,
125
+ 24, 24, 24, 24, 24, 24, 24, 24,
126
+ 24, 24, 24, 24, 24, 24, 24, 24,
127
+ 24, 24, 24, 24, 24, 24, 24, 24,
128
+ 24, 24, 24, 24, 24, 24, 24, 24,
129
+ 24, 24, 24, 24, 24, 24, 24, 24,
130
+ 1, 30, 1, 1, 1, 31, 1, 1,
131
+ 1, 1, 1, 1, 1, 1, 1, 1,
132
+ 1, 1, 1, 1, 1, 1, 1, 1,
133
+ 30, 1, 1, 1, 1, 1, 1, 1,
134
+ 32, 1, 1, 1, 1, 1, 1, 1,
135
+ 33, 33, 33, 33, 33, 33, 33, 33,
136
+ 33, 33, 1, 18, 1, 1, 1, 34,
137
+ 1, 1, 1, 1, 1, 1, 1, 1,
138
+ 1, 1, 1, 1, 1, 1, 1, 1,
139
+ 1, 1, 18, 1, 1, 1, 1, 1,
140
+ 1, 1, 35, 1, 36, 1, 1, 1,
141
+ 37, 1, 1, 1, 1, 1, 1, 1,
142
+ 1, 1, 1, 1, 1, 1, 1, 1,
143
+ 1, 1, 1, 36, 1, 1, 1, 1,
144
+ 1, 1, 1, 38, 1, 1, 0
145
+ ]
146
+
147
+ class << self
148
+ attr_accessor :_trans_targs
149
+ private :_trans_targs, :_trans_targs=
150
+ end
151
+ self._trans_targs = [
152
+ 1, 0, 2, 4, 5, 3, 1, 2,
153
+ 4, 5, 6, 7, 5, 7, 8, 16,
154
+ 16, 10, 17, 12, 13, 12, 19, 15,
155
+ 12, 13, 12, 19, 15, 14, 17, 9,
156
+ 18, 16, 9, 18, 17, 9, 18
157
+ ]
158
+
159
+ class << self
160
+ attr_accessor :_trans_actions
161
+ private :_trans_actions, :_trans_actions=
162
+ end
163
+ self._trans_actions = [
164
+ 0, 0, 0, 1, 2, 0, 3, 3,
165
+ 4, 5, 6, 7, 0, 3, 1, 8,
166
+ 9, 0, 0, 10, 10, 11, 12, 10,
167
+ 0, 0, 1, 13, 0, 0, 14, 14,
168
+ 15, 0, 0, 1, 3, 3, 4
169
+ ]
170
+
171
+ class << self
172
+ attr_accessor :_eof_actions
173
+ private :_eof_actions, :_eof_actions=
174
+ end
175
+ self._eof_actions = [
176
+ 0, 0, 0, 0, 0, 0, 0, 0,
177
+ 0, 0, 0, 0, 0, 0, 0, 0,
178
+ 14, 0, 3, 0
179
+ ]
180
+
181
+ class << self
182
+ attr_accessor :start
183
+ end
184
+ self.start = 1;
185
+ class << self
186
+ attr_accessor :first_final
187
+ end
188
+ self.first_final = 16;
189
+ class << self
190
+ attr_accessor :error
191
+ end
192
+ self.error = 0;
193
+
194
+ class << self
195
+ attr_accessor :en_comment_tail
196
+ end
197
+ self.en_comment_tail = 11;
198
+ class << self
199
+ attr_accessor :en_main
200
+ end
201
+ self.en_main = 1;
202
+
203
+
204
+
205
+ def self.parse(data)
206
+ return MimeVersionStruct.new('', nil) if Mail::Utilities.blank?(data)
207
+
208
+ # Parser state
209
+ mime_version = MimeVersionStruct.new
18
210
  major_digits_s = minor_digits_s = nil
19
- actions.each_slice(2) do |action_id, p|
20
- action = Mail::Parsers::Ragel::ACTIONS[action_id]
21
- case action
22
211
 
23
- # Major Digits
24
- when :major_digits_s then major_digits_s = p
25
- when :major_digits_e
26
- mime_version.major = s[major_digits_s..(p-1)]
212
+ # 5.1 Variables Used by Ragel
213
+ p = 0
214
+ eof = pe = data.length
215
+ stack = []
216
+
217
+
218
+ begin
219
+ p ||= 0
220
+ pe ||= data.length
221
+ cs = start
222
+ top = 0
223
+ end
224
+
225
+
226
+ begin
227
+ testEof = false
228
+ _slen, _trans, _keys, _inds, _acts, _nacts = nil
229
+ _goto_level = 0
230
+ _resume = 10
231
+ _eof_trans = 15
232
+ _again = 20
233
+ _test_eof = 30
234
+ _out = 40
235
+ while true
236
+ if _goto_level <= 0
237
+ if p == pe
238
+ _goto_level = _test_eof
239
+ next
240
+ end
241
+ if cs == 0
242
+ _goto_level = _out
243
+ next
244
+ end
245
+ end
246
+ if _goto_level <= _resume
247
+ _keys = cs << 1
248
+ _inds = _index_offsets[cs]
249
+ _slen = _key_spans[cs]
250
+ _wide = data[p].ord
251
+ _trans = if ( _slen > 0 &&
252
+ _trans_keys[_keys] <= _wide &&
253
+ _wide <= _trans_keys[_keys + 1]
254
+ ) then
255
+ _indicies[ _inds + _wide - _trans_keys[_keys] ]
256
+ else
257
+ _indicies[ _inds + _slen ]
258
+ end
259
+ cs = _trans_targs[_trans]
260
+ if _trans_actions[_trans] != 0
261
+ case _trans_actions[_trans]
262
+ when 2 then
263
+ begin
264
+ major_digits_s = p end
265
+ when 7 then
266
+ begin
267
+ mime_version.major = data[major_digits_s..(p-1)] end
268
+ when 8 then
269
+ begin
270
+ minor_digits_s = p end
271
+ when 14 then
272
+ begin
273
+ mime_version.minor = data[minor_digits_s..(p-1)] end
274
+ when 10 then
275
+ begin
276
+ end
277
+ when 3 then
278
+ begin
279
+ end
280
+ when 1 then
281
+ begin
282
+ begin
283
+ stack[top] = cs
284
+ top+= 1
285
+ cs = 11
286
+ _goto_level = _again
287
+ next
288
+ end
289
+ end
290
+ when 13 then
291
+ begin
292
+ begin
293
+ top -= 1
294
+ cs = stack[top]
295
+ _goto_level = _again
296
+ next
297
+ end
298
+ end
299
+ when 6 then
300
+ begin
301
+ mime_version.major = data[major_digits_s..(p-1)] end
302
+ begin
303
+ begin
304
+ stack[top] = cs
305
+ top+= 1
306
+ cs = 11
307
+ _goto_level = _again
308
+ next
309
+ end
310
+ end
311
+ when 15 then
312
+ begin
313
+ mime_version.minor = data[minor_digits_s..(p-1)] end
314
+ begin
315
+ begin
316
+ stack[top] = cs
317
+ top+= 1
318
+ cs = 11
319
+ _goto_level = _again
320
+ next
321
+ end
322
+ end
323
+ when 11 then
324
+ begin
325
+ end
326
+ begin
327
+ begin
328
+ stack[top] = cs
329
+ top+= 1
330
+ cs = 11
331
+ _goto_level = _again
332
+ next
333
+ end
334
+ end
335
+ when 12 then
336
+ begin
337
+ end
338
+ begin
339
+ begin
340
+ top -= 1
341
+ cs = stack[top]
342
+ _goto_level = _again
343
+ next
344
+ end
345
+ end
346
+ when 5 then
347
+ begin
348
+ end
349
+ begin
350
+ major_digits_s = p end
351
+ when 9 then
352
+ begin
353
+ end
354
+ begin
355
+ minor_digits_s = p end
356
+ when 4 then
357
+ begin
358
+ end
359
+ begin
360
+ begin
361
+ stack[top] = cs
362
+ top+= 1
363
+ cs = 11
364
+ _goto_level = _again
365
+ next
366
+ end
367
+ end
368
+ end
369
+ end
370
+ end
371
+ if _goto_level <= _again
372
+ if cs == 0
373
+ _goto_level = _out
374
+ next
375
+ end
376
+ p += 1
377
+ if p != pe
378
+ _goto_level = _resume
379
+ next
380
+ end
381
+ end
382
+ if _goto_level <= _test_eof
383
+ if p == eof
384
+ case _eof_actions[cs]
385
+ when 14 then
386
+ begin
387
+ mime_version.minor = data[minor_digits_s..(p-1)] end
388
+ when 3 then
389
+ begin
390
+ end
391
+ end
392
+ end
27
393
 
28
- # Minor Digits
29
- when :minor_digits_s then minor_digits_s = p
30
- when :minor_digits_e
31
- mime_version.minor = s[minor_digits_s..(p-1)]
394
+ end
395
+ if _goto_level <= _out
396
+ break
397
+ end
398
+ end
399
+ end
32
400
 
33
- when :comment_e, :comment_s then nil
34
401
 
35
- else
36
- raise Mail::Field::ParseError.new(Mail::MimeVersionElement, s, "Failed to process unknown action: #{action}")
37
- end
402
+ if p != eof || cs < 16
403
+ raise Mail::Field::ParseError.new(Mail::MimeVersionElement, data, "Only able to parse up to #{data[0..p]}")
38
404
  end
405
+
39
406
  mime_version
40
407
  end
41
408
  end