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