module Mail::Parsers::DateTimeParser
def self.parse(data)
def self.parse(data) data = data.dup.force_encoding(Encoding::ASCII_8BIT) if data.respond_to?(:force_encoding) raise Mail::Field::NilParseError.new(Mail::DateTimeElement) if data.nil? date_time = DateTimeStruct.new([]) # Parser state date_s = time_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 date_s = p end when 13 begin date_time.time_string = chars(data, time_s, p - 1) end when 9 begin end when 4 begin end when 3 begin begin stack[top] = cs top += 1 cs = 91 _goto_level = _again next end end when 12 begin begin top -= 1 cs = stack[top] _goto_level = _again next end end when 8 begin date_s = p end begin begin stack[top] = cs top += 1 cs = 91 _goto_level = _again next end end when 6 begin date_time.date_string = chars(data, date_s, p - 1) end begin time_s = p end when 14 begin date_time.time_string = chars(data, time_s, p - 1) end begin begin stack[top] = cs top += 1 cs = 91 _goto_level = _again next end end when 10 begin end begin begin stack[top] = cs top += 1 cs = 91 _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 begin stack[top] = cs top += 1 cs = 91 _goto_level = _again next end end when 2 begin begin stack[top] = cs top += 1 cs = 91 _goto_level = _again next end end begin date_s = p end when 7 begin end begin date_time.date_string = chars(data, date_s, p - 1) end begin time_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 13 begin date_time.time_string = chars(data, time_s, p - 1) end when 4 begin end end end end if _goto_level <= _out break end end end if p != eof || cs < 103 raise Mail::Field::IncompleteParseError.new(Mail::DateTimeElement, data, p) end date_time end