module MIME::Magic
Attributes
_magic_actions[RW]
_magic_index_offsets[RW]
_magic_indicies[RW]
_magic_key_offsets[RW]
_magic_range_lengths[RW]
_magic_single_lengths[RW]
_magic_trans_actions[RW]
_magic_trans_keys[RW]
_magic_trans_targs[RW]
magic_en_main[RW]
magic_error[RW]
magic_first_final[RW]
magic_start[RW]
Public Class Methods
parse_magic( data )
click to toggle source
line 53 “magics.rl”
# File lib/magics.rb, line 152 def self.parse_magic( data ) magics = [] data = data.unpack("c*") # line 158 "lib/magics.rb" begin p ||= 0 pe ||= data.length cs = magic_start end # line 60 "magics.rl" eof = pe # line 168 "lib/magics.rb" begin _klen, _trans, _keys, _acts, _nacts = nil _goto_level = 0 _resume = 10 _eof_trans = 15 _again = 20 _test_eof = 30 _out = 40 while true _trigger_goto = false 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 = _magic_key_offsets[cs] _trans = _magic_index_offsets[cs] _klen = _magic_single_lengths[cs] _break_match = false begin if _klen > 0 _lower = _keys _upper = _keys + _klen - 1 loop do break if _upper < _lower _mid = _lower + ( (_upper - _lower) >> 1 ) if data[p] < _magic_trans_keys[_mid] _upper = _mid - 1 elsif data[p] > _magic_trans_keys[_mid] _lower = _mid + 1 else _trans += (_mid - _keys) _break_match = true break end end # loop break if _break_match _keys += _klen _trans += _klen end _klen = _magic_range_lengths[cs] if _klen > 0 _lower = _keys _upper = _keys + (_klen << 1) - 2 loop do break if _upper < _lower _mid = _lower + (((_upper-_lower) >> 1) & ~1) if data[p] < _magic_trans_keys[_mid] _upper = _mid - 2 elsif data[p] > _magic_trans_keys[_mid+1] _lower = _mid + 2 else _trans += ((_mid - _keys) >> 1) _break_match = true break end end # loop break if _break_match _trans += _klen end end while false _trans = _magic_indicies[_trans] cs = _magic_trans_targs[_trans] if _magic_trans_actions[_trans] != 0 _acts = _magic_trans_actions[_trans] _nacts = _magic_actions[_acts] _acts += 1 while _nacts > 0 _nacts -= 1 _acts += 1 case _magic_actions[_acts - 1] when 0 then # line 6 "magics.rl" begin b = p end # line 6 "magics.rl" when 1 then # line 7 "magics.rl" begin e = data[ b .. p] end # line 7 "magics.rl" when 2 then # line 8 "magics.rl" begin n = e.pack("c*").to_i end # line 8 "magics.rl" when 3 then # line 12 "magics.rl" begin type = e.pack("c*") end # line 12 "magics.rl" when 4 then # line 17 "magics.rl" begin value_length = data[p+1, 2].pack("c*").unpack('n').first p +=2 value = data[p+1, value_length] mask = [0xff] * value_length p += value_length end # line 17 "magics.rl" when 5 then # line 24 "magics.rl" begin mask = data[p+1, value_length] p += value_length end # line 24 "magics.rl" when 6 then # line 28 "magics.rl" begin priority = n end # line 28 "magics.rl" when 7 then # line 29 "magics.rl" begin indent = n end # line 29 "magics.rl" when 8 then # line 30 "magics.rl" begin start_offset = n end # line 30 "magics.rl" when 9 then # line 31 "magics.rl" begin word_size = n end # line 31 "magics.rl" when 10 then # line 32 "magics.rl" begin range_length = n end # line 32 "magics.rl" when 11 then # line 33 "magics.rl" begin magics << RootEntry.new(type, priority) end # line 33 "magics.rl" when 12 then # line 34 "magics.rl" begin indent = 0; word_size = 0; range_length = 1 end # line 34 "magics.rl" when 13 then # line 35 "magics.rl" begin magics.last.add_subentry Entry.new(indent, start_offset, value_length, value, mask, word_size, range_length) end # line 35 "magics.rl" # line 330 "lib/magics.rb" end # action switch end end if _trigger_goto next 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 end if _goto_level <= _out break end end end # line 62 "magics.rl" if cs < magic_first_final raise BadMagic end magics end