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 31962
    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] 
                    ) then
                        _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 then
                begin
 phrase_e = p-1                 end
        when 8 then
                begin
 qstr_s = p             end
        when 10 then
                begin
 qstr = chars(data, qstr_s, p-1)                end
        when 59 then
                begin
 comment_s = p unless comment_s                 end
        when 12 then
                begin

    if address
      address.comments << chars(data, comment_s, p-2)
    end
    comment_s = nil
                end
        when 34 then
                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 then
                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 then
                begin
 domain_s = p           end
        when 54 then
                begin

    address.domain = chars(data, domain_s, p-1).rstrip if address
                end
        when 1 then
                begin
 local_dot_atom_s = p           end
        when 24 then
                begin
 local_dot_atom_e = p-1                 end
        when 21 then
                begin
 local_dot_atom_pre_comment_e = p-1             end
        when 50 then
                begin
 address.local = '"' + qstr + '"' if address            end
        when 20 then
                begin
 obs_domain_list_s = p          end
        when 2 then
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 2449
                _goto_level = _again
                next
        end
                end
        when 62 then
                begin
        begin
                top -= 1
                cs = stack[top]
                _goto_level = _again
                next
        end
                end
        when 6 then
                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 then
                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 then
                begin
 phrase_e = p-1                 end
                begin
 domain_s = p           end
        when 30 then
                begin
 phrase_e = p-1                 end
                begin
 local_dot_atom_pre_comment_e = p-1             end
        when 9 then
                begin
 qstr_s = p             end
                begin
 qstr = chars(data, qstr_s, p-1)                end
        when 60 then
                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 then
                begin
 comment_s = p unless comment_s                 end
                begin
        begin
                top -= 1
                cs = stack[top]
                _goto_level = _again
                next
        end
                end
        when 11 then
                begin

    if address
      address.comments << chars(data, comment_s, p-2)
    end
    comment_s = nil
                end
                begin
 phrase_e = p-1                 end
        when 35 then
                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 then
                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 then
                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 then
                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 then
                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 then
                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 then
                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 then
                begin
 address_s = p          end
                begin
 phrase_s = p           end
        when 28 then
                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 then
                begin
 domain_s = p           end
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 2449
                _goto_level = _again
                next
        end
                end
        when 45 then
                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 then
                begin
 local_dot_atom_s = p           end
                begin
 obs_domain_list_s = p          end
        when 33 then
                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 then
                begin
 local_dot_atom_e = p-1                 end
                begin
 address.local = '"' + qstr + '"' if address            end
        when 23 then
                begin
 local_dot_atom_pre_comment_e = p-1             end
                begin
 local_dot_atom_e = p-1                 end
        when 22 then
                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 then
                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 then
                begin
 address.obs_domain_list = chars(data, obs_domain_list_s, p-1)          end
                begin
 local_dot_atom_s = p           end
        when 5 then
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 2449
                _goto_level = _again
                next
        end
                end
                begin
 phrase_e = p-1                 end
        when 14 then
                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 then
                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 then
                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 then
                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 then
                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 then
                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 then
                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 then
                begin
 group_name_s = p               end
                begin
 phrase_s = p           end
                begin
 address_s = p          end
        when 26 then
                begin
 address_s = p          end
                begin
 phrase_s = p           end
                begin
 local_dot_atom_s = p           end
        when 19 then
                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 then
                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 then
                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 then
                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 then
                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 then
                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 then
                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 then
                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 then
                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 then
                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 then
                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 then
                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 then
                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 then
                begin

    if address
      address.comments << chars(data, comment_s, p-2)
    end
    comment_s = nil
                end
        when 34 then
                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 then
                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 then
                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 then
                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 then
                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 then
                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 then
                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 then
                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 then
                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 then
                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 then
                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 then
                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