class Mail::Parsers::PhraseListsParser

Constants

PhraseListsStruct

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/phrase_lists_parser.rb, line 680
def self.parse(data)
  data = data.dup.force_encoding(Encoding::ASCII_8BIT) if data.respond_to?(:force_encoding)

  raise Mail::Field::NilParseError.new(Mail::PhraseList) if data.nil?

  # Parser state
  phrase_lists = PhraseListsStruct.new([])
  phrase_s = 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 1
            begin
              phrase_s = p
            end
          when 13
            begin
              phrase_lists.phrases << chars(data, phrase_s, p - 1) if phrase_s
              phrase_s = nil
            end
          when 7
            begin
            end
          when 9
            begin
            end
          when 6
            begin
            end
          when 4
            begin
            end
          when 3
            begin
              begin
                stack[top] = cs
                top += 1
                cs = 30
                _goto_level = _again
                next
              end
            end
          when 12
            begin
              begin
                top -= 1
                cs = stack[top]
                _goto_level = _again
                next
              end
            end
          when 2
            begin
              phrase_s = p
            end
            begin
              begin
                stack[top] = cs
                top += 1
                cs = 30
                _goto_level = _again
                next
              end
            end
          when 14
            begin
            end
            begin
              phrase_lists.phrases << chars(data, phrase_s, p - 1) if phrase_s
              phrase_s = nil
            end
          when 8
            begin
            end
            begin
              begin
                stack[top] = cs
                top += 1
                cs = 30
                _goto_level = _again
                next
              end
            end
          when 10
            begin
            end
            begin
              begin
                stack[top] = cs
                top += 1
                cs = 30
                _goto_level = _again
                next
              end
            end
          when 11
            begin
            end
            begin
              begin
                top -= 1
                cs = stack[top]
                _goto_level = _again
                next
              end
            end
          when 5
            begin
            end
            begin
            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 13
            begin
              phrase_lists.phrases << chars(data, phrase_s, p - 1) if phrase_s
              phrase_s = nil
            end
          when 14
            begin
            end
            begin
              phrase_lists.phrases << chars(data, phrase_s, p - 1) if phrase_s
              phrase_s = nil
            end
          end
        end
      end
      if _goto_level <= _out
        break
      end
    end
  end

  if p != eof || cs < 42
    raise Mail::Field::IncompleteParseError.new(Mail::PhraseList, data, p)
  end

  phrase_lists
end