def self.parse(data)
data = data.dup.force_encoding(Encoding::ASCII_8BIT) if data.respond_to?(:force_encoding)
raise Mail::Field::NilParseError.new(Mail::MessageIdsElement) if data.nil?
message_ids = MessageIdsStruct.new([])
msg_id_s = nil
p = 0
eof = pe = data.length
stack = []
begin
p ||= 0
pe ||= data.length
cs = start
top = 0
end
begin
testEof = false
_slen, _trans, _keys, _inds, _acts, _nacts = nil
_goto_level = 0
_resume = 10
_eof_trans = 15
_again = 20
_test_eof = 30
_out = 40
while true
if _goto_level <= 0
if p == pe
_goto_level = _test_eof
next
end
if cs == 0
_goto_level = _out
next
end
end
if _goto_level <= _resume
_keys = cs << 1
_inds = _index_offsets[cs]
_slen = _key_spans[cs]
_wide = data[p].ord
_trans = if (_slen > 0 &&
_trans_keys[_keys] <= _wide &&
_wide <= _trans_keys[_keys + 1])
_indicies[_inds + _wide - _trans_keys[_keys]]
else
_indicies[_inds + _slen]
end
cs = _trans_targs[_trans]
if _trans_actions[_trans] != 0
case _trans_actions[_trans]
when 1
begin
msg_id_s = p
end
when 30
begin
id = chars(data, msg_id_s, p - 1)
id = $1 if id =~ /.*<(.*)>.*/
message_ids.message_ids << id
end
when 9
begin
end
when 26
begin
end
when 14
begin
end
when 12
begin
end
when 8
begin
end
when 5
begin
end
when 3
begin
end
when 18
begin
end
when 16
begin
end
when 22
begin
end
when 2
begin
begin
stack[top] = cs
top += 1
cs = 306
_goto_level = _again
next
end
end
when 29
begin
begin
top -= 1
cs = stack[top]
_goto_level = _again
next
end
end
when 32
begin
id = chars(data, msg_id_s, p - 1)
id = $1 if id =~ /.*<(.*)>.*/
message_ids.message_ids << id
end
begin
msg_id_s = p
end
when 31
begin
id = chars(data, msg_id_s, p - 1)
id = $1 if id =~ /.*<(.*)>.*/
message_ids.message_ids << id
end
begin
begin
stack[top] = cs
top += 1
cs = 306
_goto_level = _again
next
end
end
when 25
begin
end
begin
msg_id_s = p
end
when 15
begin
end
begin
end
when 11
begin
end
begin
end
when 24
begin
end
begin
end
when 23
begin
end
begin
end
when 10
begin
end
begin
begin
stack[top] = cs
top += 1
cs = 306
_goto_level = _again
next
end
end
when 27
begin
end
begin
begin
stack[top] = cs
top += 1
cs = 306
_goto_level = _again
next
end
end
when 28
begin
end
begin
begin
top -= 1
cs = stack[top]
_goto_level = _again
next
end
end
when 13
begin
end
begin
begin
stack[top] = cs
top += 1
cs = 306
_goto_level = _again
next
end
end
when 20
begin
end
begin
end
when 33
begin
end
begin
id = chars(data, msg_id_s, p - 1)
id = $1 if id =~ /.*<(.*)>.*/
message_ids.message_ids << id
end
when 7
begin
end
begin
end
when 6
begin
end
begin
begin
stack[top] = cs
top += 1
cs = 306
_goto_level = _again
next
end
end
when 4
begin
end
begin
begin
stack[top] = cs
top += 1
cs = 306
_goto_level = _again
next
end
end
when 17
begin
end
begin
end
when 21
begin
end
begin
end
begin
end
when 19
begin
end
begin
end
begin
end
when 34
begin
end
begin
begin
stack[top] = cs
top += 1
cs = 306
_goto_level = _again
next
end
end
begin
id = chars(data, msg_id_s, p - 1)
id = $1 if id =~ /.*<(.*)>.*/
message_ids.message_ids << id
end
end
end
end
if _goto_level <= _again
if cs == 0
_goto_level = _out
next
end
p += 1
if p != pe
_goto_level = _resume
next
end
end
if _goto_level <= _test_eof
if p == eof
case _eof_actions[cs]
when 30
begin
id = chars(data, msg_id_s, p - 1)
id = $1 if id =~ /.*<(.*)>.*/
message_ids.message_ids << id
end
when 9
begin
end
end
end
end
if _goto_level <= _out
break
end
end
end
if p != eof || cs < 318
raise Mail::Field::IncompleteParseError.new(Mail::MessageIdsElement, data, p)
end
message_ids
end