module Mail::Parsers::AddressListsParser
Constants
- AddressListStruct
- AddressStruct
Attributes
_eof_actions[RW]
_index_offsets[RW]
_indicies[RW]
_key_spans[RW]
_trans_actions[RW]
_trans_keys[RW]
_trans_targs[RW]
en_comment_tail[RW]
en_main[RW]
error[RW]
first_final[RW]
start[RW]
Public Class Methods
parse(data)
click to toggle source
# File lib/mail/parsers/address_lists_parser.rb, line 31959 def self.parse(data) data = data.dup.force_encoding(Encoding::ASCII_8BIT) if data.respond_to?(:force_encoding) address_list = AddressListStruct.new([], []) return address_list if Mail::Utilities.blank?(data) phrase_s = phrase_e = qstr_s = qstr = comment_s = nil group_name_s = domain_s = group_name = nil local_dot_atom_s = local_dot_atom_e = nil local_dot_atom_pre_comment_e = nil obs_domain_list_s = nil address_s = 0 address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil) # 5.1 Variables Used by Ragel 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 4 begin phrase_e = p - 1 end when 8 begin qstr_s = p end when 10 begin qstr = chars(data, qstr_s, p - 1) end when 59 begin comment_s = p unless comment_s end when 12 begin if address address.comments << chars(data, comment_s, p - 2) end comment_s = nil end when 34 begin if address_s if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e if address.domain address.local = chars(data, local_dot_atom_s, local_dot_atom_e) else address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e) end end address.raw = chars(data, address_s, p - 1) address_list.addresses << address if address # Start next address address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil) address.group = group_name address_s = nil end end when 3 begin if qstr address.display_name = Mail::Utilities.unescape(qstr) qstr = nil elsif phrase_e address.display_name = chars(data, phrase_s, phrase_e).strip phrase_e = phrase_s = nil end end when 43 begin domain_s = p end when 54 begin address.domain = chars(data, domain_s, p - 1).rstrip if address end when 1 begin local_dot_atom_s = p end when 24 begin local_dot_atom_e = p - 1 end when 21 begin local_dot_atom_pre_comment_e = p - 1 end when 50 begin address.local = '"' + qstr + '"' if address end when 20 begin obs_domain_list_s = p end when 2 begin begin stack[top] = cs top += 1 cs = 2449 _goto_level = _again next end end when 62 begin begin top -= 1 cs = stack[top] _goto_level = _again next end end when 6 begin phrase_e = p - 1 end begin if qstr group = qstr qstr = nil else group = chars(data, group_name_s, p - 1) group_name_s = nil end address_list.group_names << group group_name = group # Start next address address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil) address_s = p address.group = group_name end when 7 begin phrase_e = p - 1 end begin if qstr address.display_name = Mail::Utilities.unescape(qstr) qstr = nil elsif phrase_e address.display_name = chars(data, phrase_s, phrase_e).strip phrase_e = phrase_s = nil end end when 42 begin phrase_e = p - 1 end begin domain_s = p end when 30 begin phrase_e = p - 1 end begin local_dot_atom_pre_comment_e = p - 1 end when 9 begin qstr_s = p end begin qstr = chars(data, qstr_s, p - 1) end when 60 begin comment_s = p unless comment_s end begin begin stack[top] = cs top += 1 cs = 2449 _goto_level = _again next end end when 61 begin comment_s = p unless comment_s end begin begin top -= 1 cs = stack[top] _goto_level = _again next end end when 11 begin if address address.comments << chars(data, comment_s, p - 2) end comment_s = nil end begin phrase_e = p - 1 end when 35 begin if address address.comments << chars(data, comment_s, p - 2) end comment_s = nil end begin if address_s if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e if address.domain address.local = chars(data, local_dot_atom_s, local_dot_atom_e) else address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e) end end address.raw = chars(data, address_s, p - 1) address_list.addresses << address if address # Start next address address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil) address.group = group_name address_s = nil end end when 17 begin if address address.comments << chars(data, comment_s, p - 2) end comment_s = nil end begin if qstr address.display_name = Mail::Utilities.unescape(qstr) qstr = nil elsif phrase_e address.display_name = chars(data, phrase_s, phrase_e).strip phrase_e = phrase_s = nil end end when 55 begin if address address.comments << chars(data, comment_s, p - 2) end comment_s = nil end begin address.domain = chars(data, domain_s, p - 1).rstrip if address end when 53 begin if address address.comments << chars(data, comment_s, p - 2) end comment_s = nil end begin local_dot_atom_s = p end when 25 begin if address address.comments << chars(data, comment_s, p - 2) end comment_s = nil end begin local_dot_atom_e = p - 1 end when 52 begin if address address.comments << chars(data, comment_s, p - 2) end comment_s = nil end begin address.local = '"' + qstr + '"' if address end when 16 begin if address address.comments << chars(data, comment_s, p - 2) end comment_s = nil end begin begin stack[top] = cs top += 1 cs = 2449 _goto_level = _again next end end when 29 begin address_s = p end begin phrase_s = p end when 28 begin address_s = p end begin if qstr address.display_name = Mail::Utilities.unescape(qstr) qstr = nil elsif phrase_e address.display_name = chars(data, phrase_s, phrase_e).strip phrase_e = phrase_s = nil end end when 48 begin domain_s = p end begin begin stack[top] = cs top += 1 cs = 2449 _goto_level = _again next end end when 45 begin address.domain = chars(data, domain_s, p - 1).rstrip if address end begin if address_s if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e if address.domain address.local = chars(data, local_dot_atom_s, local_dot_atom_e) else address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e) end end address.raw = chars(data, address_s, p - 1) address_list.addresses << address if address # Start next address address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil) address.group = group_name address_s = nil end end when 18 begin local_dot_atom_s = p end begin obs_domain_list_s = p end when 33 begin local_dot_atom_e = p - 1 end begin if address_s if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e if address.domain address.local = chars(data, local_dot_atom_s, local_dot_atom_e) else address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e) end end address.raw = chars(data, address_s, p - 1) address_list.addresses << address if address # Start next address address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil) address.group = group_name address_s = nil end end when 39 begin local_dot_atom_e = p - 1 end begin address.local = '"' + qstr + '"' if address end when 23 begin local_dot_atom_pre_comment_e = p - 1 end begin local_dot_atom_e = p - 1 end when 22 begin local_dot_atom_pre_comment_e = p - 1 end begin begin stack[top] = cs top += 1 cs = 2449 _goto_level = _again next end end when 49 begin address.local = '"' + qstr + '"' if address end begin if address_s if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e if address.domain address.local = chars(data, local_dot_atom_s, local_dot_atom_e) else address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e) end end address.raw = chars(data, address_s, p - 1) address_list.addresses << address if address # Start next address address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil) address.group = group_name address_s = nil end end when 56 begin address.obs_domain_list = chars(data, obs_domain_list_s, p - 1) end begin local_dot_atom_s = p end when 5 begin begin stack[top] = cs top += 1 cs = 2449 _goto_level = _again next end end begin phrase_e = p - 1 end when 14 begin if address address.comments << chars(data, comment_s, p - 2) end comment_s = nil end begin phrase_e = p - 1 end begin if qstr group = qstr qstr = nil else group = chars(data, group_name_s, p - 1) group_name_s = nil end address_list.group_names << group group_name = group # Start next address address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil) address_s = p address.group = group_name end when 15 begin if address address.comments << chars(data, comment_s, p - 2) end comment_s = nil end begin phrase_e = p - 1 end begin if qstr address.display_name = Mail::Utilities.unescape(qstr) qstr = nil elsif phrase_e address.display_name = chars(data, phrase_s, phrase_e).strip phrase_e = phrase_s = nil end end when 46 begin if address address.comments << chars(data, comment_s, p - 2) end comment_s = nil end begin address.domain = chars(data, domain_s, p - 1).rstrip if address end begin if address_s if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e if address.domain address.local = chars(data, local_dot_atom_s, local_dot_atom_e) else address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e) end end address.raw = chars(data, address_s, p - 1) address_list.addresses << address if address # Start next address address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil) address.group = group_name address_s = nil end end when 47 begin if address address.comments << chars(data, comment_s, p - 2) end comment_s = nil end begin local_dot_atom_e = p - 1 end begin if address_s if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e if address.domain address.local = chars(data, local_dot_atom_s, local_dot_atom_e) else address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e) end end address.raw = chars(data, address_s, p - 1) address_list.addresses << address if address # Start next address address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil) address.group = group_name address_s = nil end end when 41 begin if address address.comments << chars(data, comment_s, p - 2) end comment_s = nil end begin local_dot_atom_e = p - 1 end begin address.local = '"' + qstr + '"' if address end when 51 begin if address address.comments << chars(data, comment_s, p - 2) end comment_s = nil end begin address.local = '"' + qstr + '"' if address end begin if address_s if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e if address.domain address.local = chars(data, local_dot_atom_s, local_dot_atom_e) else address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e) end end address.raw = chars(data, address_s, p - 1) address_list.addresses << address if address # Start next address address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil) address.group = group_name address_s = nil end end when 13 begin if address address.comments << chars(data, comment_s, p - 2) end comment_s = nil end begin begin stack[top] = cs top += 1 cs = 2449 _goto_level = _again next end end begin phrase_e = p - 1 end when 65 begin group_name_s = p end begin phrase_s = p end begin address_s = p end when 26 begin address_s = p end begin phrase_s = p end begin local_dot_atom_s = p end when 19 begin local_dot_atom_s = p end begin begin stack[top] = cs top += 1 cs = 2449 _goto_level = _again next end end begin obs_domain_list_s = p end when 38 begin local_dot_atom_e = p - 1 end begin address.local = '"' + qstr + '"' if address end begin if address_s if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e if address.domain address.local = chars(data, local_dot_atom_s, local_dot_atom_e) else address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e) end end address.raw = chars(data, address_s, p - 1) address_list.addresses << address if address # Start next address address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil) address.group = group_name address_s = nil end end when 32 begin local_dot_atom_pre_comment_e = p - 1 end begin local_dot_atom_e = p - 1 end begin if address_s if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e if address.domain address.local = chars(data, local_dot_atom_s, local_dot_atom_e) else address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e) end end address.raw = chars(data, address_s, p - 1) address_list.addresses << address if address # Start next address address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil) address.group = group_name address_s = nil end end when 37 begin local_dot_atom_pre_comment_e = p - 1 end begin local_dot_atom_e = p - 1 end begin address.local = '"' + qstr + '"' if address end when 57 begin address.obs_domain_list = chars(data, obs_domain_list_s, p - 1) end begin local_dot_atom_s = p end begin begin stack[top] = cs top += 1 cs = 2449 _goto_level = _again next end end when 44 begin begin stack[top] = cs top += 1 cs = 2449 _goto_level = _again next end end begin phrase_e = p - 1 end begin domain_s = p end when 31 begin begin stack[top] = cs top += 1 cs = 2449 _goto_level = _again next end end begin phrase_e = p - 1 end begin local_dot_atom_pre_comment_e = p - 1 end when 40 begin if address address.comments << chars(data, comment_s, p - 2) end comment_s = nil end begin local_dot_atom_e = p - 1 end begin address.local = '"' + qstr + '"' if address end begin if address_s if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e if address.domain address.local = chars(data, local_dot_atom_s, local_dot_atom_e) else address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e) end end address.raw = chars(data, address_s, p - 1) address_list.addresses << address if address # Start next address address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil) address.group = group_name address_s = nil end end when 63 begin group_name_s = p end begin phrase_s = p end begin address_s = p end begin local_dot_atom_s = p end when 27 begin address_s = p end begin phrase_s = p end begin begin stack[top] = cs top += 1 cs = 2449 _goto_level = _again next end end begin local_dot_atom_s = p end when 36 begin local_dot_atom_pre_comment_e = p - 1 end begin local_dot_atom_e = p - 1 end begin address.local = '"' + qstr + '"' if address end begin if address_s if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e if address.domain address.local = chars(data, local_dot_atom_s, local_dot_atom_e) else address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e) end end address.raw = chars(data, address_s, p - 1) address_list.addresses << address if address # Start next address address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil) address.group = group_name address_s = nil end end when 58 begin begin stack[top] = cs top += 1 cs = 2449 _goto_level = _again next end end begin address_s = p end begin phrase_s = p end begin local_dot_atom_s = p end when 64 begin group_name_s = p end begin phrase_s = p end begin begin stack[top] = cs top += 1 cs = 2449 _goto_level = _again next end end begin address_s = p end begin local_dot_atom_s = p 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 12 begin if address address.comments << chars(data, comment_s, p - 2) end comment_s = nil end when 34 begin if address_s if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e if address.domain address.local = chars(data, local_dot_atom_s, local_dot_atom_e) else address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e) end end address.raw = chars(data, address_s, p - 1) address_list.addresses << address if address # Start next address address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil) address.group = group_name address_s = nil end end when 35 begin if address address.comments << chars(data, comment_s, p - 2) end comment_s = nil end begin if address_s if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e if address.domain address.local = chars(data, local_dot_atom_s, local_dot_atom_e) else address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e) end end address.raw = chars(data, address_s, p - 1) address_list.addresses << address if address # Start next address address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil) address.group = group_name address_s = nil end end when 45 begin address.domain = chars(data, domain_s, p - 1).rstrip if address end begin if address_s if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e if address.domain address.local = chars(data, local_dot_atom_s, local_dot_atom_e) else address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e) end end address.raw = chars(data, address_s, p - 1) address_list.addresses << address if address # Start next address address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil) address.group = group_name address_s = nil end end when 33 begin local_dot_atom_e = p - 1 end begin if address_s if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e if address.domain address.local = chars(data, local_dot_atom_s, local_dot_atom_e) else address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e) end end address.raw = chars(data, address_s, p - 1) address_list.addresses << address if address # Start next address address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil) address.group = group_name address_s = nil end end when 49 begin address.local = '"' + qstr + '"' if address end begin if address_s if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e if address.domain address.local = chars(data, local_dot_atom_s, local_dot_atom_e) else address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e) end end address.raw = chars(data, address_s, p - 1) address_list.addresses << address if address # Start next address address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil) address.group = group_name address_s = nil end end when 46 begin if address address.comments << chars(data, comment_s, p - 2) end comment_s = nil end begin address.domain = chars(data, domain_s, p - 1).rstrip if address end begin if address_s if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e if address.domain address.local = chars(data, local_dot_atom_s, local_dot_atom_e) else address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e) end end address.raw = chars(data, address_s, p - 1) address_list.addresses << address if address # Start next address address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil) address.group = group_name address_s = nil end end when 47 begin if address address.comments << chars(data, comment_s, p - 2) end comment_s = nil end begin local_dot_atom_e = p - 1 end begin if address_s if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e if address.domain address.local = chars(data, local_dot_atom_s, local_dot_atom_e) else address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e) end end address.raw = chars(data, address_s, p - 1) address_list.addresses << address if address # Start next address address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil) address.group = group_name address_s = nil end end when 51 begin if address address.comments << chars(data, comment_s, p - 2) end comment_s = nil end begin address.local = '"' + qstr + '"' if address end begin if address_s if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e if address.domain address.local = chars(data, local_dot_atom_s, local_dot_atom_e) else address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e) end end address.raw = chars(data, address_s, p - 1) address_list.addresses << address if address # Start next address address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil) address.group = group_name address_s = nil end end when 38 begin local_dot_atom_e = p - 1 end begin address.local = '"' + qstr + '"' if address end begin if address_s if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e if address.domain address.local = chars(data, local_dot_atom_s, local_dot_atom_e) else address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e) end end address.raw = chars(data, address_s, p - 1) address_list.addresses << address if address # Start next address address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil) address.group = group_name address_s = nil end end when 32 begin local_dot_atom_pre_comment_e = p - 1 end begin local_dot_atom_e = p - 1 end begin if address_s if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e if address.domain address.local = chars(data, local_dot_atom_s, local_dot_atom_e) else address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e) end end address.raw = chars(data, address_s, p - 1) address_list.addresses << address if address # Start next address address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil) address.group = group_name address_s = nil end end when 40 begin if address address.comments << chars(data, comment_s, p - 2) end comment_s = nil end begin local_dot_atom_e = p - 1 end begin address.local = '"' + qstr + '"' if address end begin if address_s if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e if address.domain address.local = chars(data, local_dot_atom_s, local_dot_atom_e) else address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e) end end address.raw = chars(data, address_s, p - 1) address_list.addresses << address if address # Start next address address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil) address.group = group_name address_s = nil end end when 36 begin local_dot_atom_pre_comment_e = p - 1 end begin local_dot_atom_e = p - 1 end begin address.local = '"' + qstr + '"' if address end begin if address_s if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e if address.domain address.local = chars(data, local_dot_atom_s, local_dot_atom_e) else address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e) end end address.raw = chars(data, address_s, p - 1) address_list.addresses << address if address # Start next address address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil) address.group = group_name address_s = nil end end end end end if _goto_level <= _out break end end end if p != eof || cs < 2461 raise Mail::Field::IncompleteParseError.new(Mail::AddressList, data, p) end address_list end