Class: Silhouette::BinaryEmitter

Inherits:
Emitter
  • Object
show all
Defined in:
lib/silhouette/emitters.rb

Defined Under Namespace

Classes: DoneParsing

Constant Summary collapse

MAGIC =
"<>"
FIXED_SIZE =
{
    ?c => 20,
    ?r => 20,
    ?@ => 8
}

Instance Attribute Summary

Attributes inherited from Emitter

#processor

Instance Method Summary collapse

Constructor Details

#initialize(file, processor = nil) ⇒ BinaryEmitter

Returns a new instance of BinaryEmitter.

Raises:



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/silhouette/emitters.rb', line 60

def initialize(file, processor=nil)
    if file.kind_of? String
        raise "Unknown file" unless File.exists?(file)
        @io = File.open(file)
    else
        @io = file
    end
    
    magic = @io.read(2)
    raise InvalidFormat unless magic == MAGIC
    
    @method_size = "S"
    @file_size = "S"
    @ret_call_fmt = "i#{@method_size}#{@file_size}ii"
    @ret_call_size = 16
    super(processor)
end

Instance Method Details

#next_cmdObject

Raises:



93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/silhouette/emitters.rb', line 93

def next_cmd
    str = @io.read(1)
    raise DoneParsing unless str

    cmd = str[0]
    if [?!, ?*, ?&].include? cmd
        size = @io.read(4).unpack("i").first
    else
        size = FIXED_SIZE[cmd]
    end
        
    [cmd, size, @io.read(size)]
end

#parseObject



80
81
82
83
84
85
# File 'lib/silhouette/emitters.rb', line 80

def parse
    begin
        loop { emit }
    rescue DoneParsing
    end
end