ruby: patron for memory primitives
parent
fb1b424cbf
commit
52007e0d4f
@ -0,0 +1,200 @@
|
|||||||
|
module DFHack
|
||||||
|
module MemHack
|
||||||
|
|
||||||
|
class MemStruct
|
||||||
|
attr_accessor :_memaddr
|
||||||
|
def _at(addr) ; @_memaddr = addr ; self ; end
|
||||||
|
def _get ; self ; end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Compound < MemStruct
|
||||||
|
class << self
|
||||||
|
attr_accessor :_fields
|
||||||
|
def field(name, offset)
|
||||||
|
struct = yield
|
||||||
|
@_fields ||= []
|
||||||
|
@_fields << [name, offset, struct]
|
||||||
|
define_method(name) { struct._at(@_memaddr+offset)._get }
|
||||||
|
define_method("#{name}=") { |v| struct._at(@_memaddr+offset)._set(v) }
|
||||||
|
end
|
||||||
|
|
||||||
|
def number(bits, signed)
|
||||||
|
Number.new(bits, signed)
|
||||||
|
end
|
||||||
|
def float
|
||||||
|
Float.new
|
||||||
|
end
|
||||||
|
def bit(shift)
|
||||||
|
BitField.new(shift, 1)
|
||||||
|
end
|
||||||
|
def bits(shift, len)
|
||||||
|
BitField.new(shift, len)
|
||||||
|
end
|
||||||
|
def pointer(tglen=nil)
|
||||||
|
Pointer.new(tglen, (yield if tglen))
|
||||||
|
end
|
||||||
|
def static_array(len, tglen)
|
||||||
|
StaticArray.new(tglen, len, yield)
|
||||||
|
end
|
||||||
|
def static_string(len)
|
||||||
|
StaticString.new(len)
|
||||||
|
end
|
||||||
|
|
||||||
|
def stl_vector(tglen=nil)
|
||||||
|
StlVector.new(tglen, (yield if tglen))
|
||||||
|
end
|
||||||
|
def stl_string
|
||||||
|
StlString.new
|
||||||
|
end
|
||||||
|
def stl_bit_vector
|
||||||
|
StlBitVector.new
|
||||||
|
end
|
||||||
|
def stl_deque(tglen=nil)
|
||||||
|
StlDeque.new(tglen, (yield if tglen))
|
||||||
|
end
|
||||||
|
|
||||||
|
def df_flagarray
|
||||||
|
DfFlagarray.new
|
||||||
|
end
|
||||||
|
def df_array(tglen=nil)
|
||||||
|
DfArray.new(tglen, (yield if tglen))
|
||||||
|
end
|
||||||
|
def df_linked_list
|
||||||
|
DfLinkedList.new((yield if block_given?))
|
||||||
|
end
|
||||||
|
|
||||||
|
def global(glob)
|
||||||
|
Global.new(glob)
|
||||||
|
end
|
||||||
|
def compound(&b)
|
||||||
|
m = Class.new(Compound)
|
||||||
|
m.instance_eval(&b)
|
||||||
|
m
|
||||||
|
end
|
||||||
|
end
|
||||||
|
def _set(h) ; h.each { |k, v| send("_#{k}=", v) } ; end
|
||||||
|
end
|
||||||
|
class Number < MemStruct
|
||||||
|
attr_accessor :_bits, :_signed
|
||||||
|
def initialize(bits, signed)
|
||||||
|
@_bits = bits
|
||||||
|
@_signed = signed
|
||||||
|
end
|
||||||
|
end
|
||||||
|
class Float < MemStruct
|
||||||
|
end
|
||||||
|
class BitField < Number
|
||||||
|
attr_accessor :_shift, :_len
|
||||||
|
def initialize(shift, len)
|
||||||
|
@_shift = shift
|
||||||
|
@_len = len
|
||||||
|
super(32, false)
|
||||||
|
end
|
||||||
|
|
||||||
|
def _get(whole=false)
|
||||||
|
v = super()
|
||||||
|
return v if whole
|
||||||
|
v = (v >> @_shift) % (1 << @_len)
|
||||||
|
if @_len == 1
|
||||||
|
v == 0 ? false : true
|
||||||
|
else
|
||||||
|
v
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def _set(v)
|
||||||
|
if @_len == 1
|
||||||
|
v = (v && v != 0 ? 1 : 0)
|
||||||
|
end
|
||||||
|
v = ((v % (1 << @_len)) << @_shift)
|
||||||
|
|
||||||
|
ori = _get(true)
|
||||||
|
super(ori - (ori & (-1 % (1 << @_len)) << @_shift) + v)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Pointer < MemStruct
|
||||||
|
attr_accessor :_tglen, :_tg
|
||||||
|
def initialize(tglen, tg)
|
||||||
|
@_tglen = tglen
|
||||||
|
@_tg = tg
|
||||||
|
end
|
||||||
|
end
|
||||||
|
class StaticArray < MemStruct
|
||||||
|
attr_accessor :_tglen, :_length, :_tg
|
||||||
|
def initialize(tglen, length, tg)
|
||||||
|
@_tglen = tglen
|
||||||
|
@_length = length
|
||||||
|
@_tg = tg
|
||||||
|
end
|
||||||
|
def _set(a) ; a.each_with_index { |v, i| self[i] = v } ; end
|
||||||
|
alias length _length
|
||||||
|
alias size _length
|
||||||
|
def _tgat(i)
|
||||||
|
tg._at(@_memaddr + i*@_tglen)
|
||||||
|
end
|
||||||
|
def [](i)
|
||||||
|
if (i > 0) or (@_length and i < @_length)
|
||||||
|
tgat(i)._get
|
||||||
|
end
|
||||||
|
end
|
||||||
|
def []=(i, v)
|
||||||
|
if (i > 0) or (@_length and i < @_length)
|
||||||
|
tgat(i)._set
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
class StaticString < MemStruct
|
||||||
|
attr_accessor :_length
|
||||||
|
def initialize(length)
|
||||||
|
@_length = length
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class StlVector < MemStruct
|
||||||
|
attr_accessor :_tglen, :_tg
|
||||||
|
def initialize(tglen, tg)
|
||||||
|
@_tglen = tglen
|
||||||
|
@_tg = tg
|
||||||
|
end
|
||||||
|
end
|
||||||
|
class StlString < MemStruct
|
||||||
|
end
|
||||||
|
class StlBitVector < MemStruct
|
||||||
|
end
|
||||||
|
class StlDeque < MemStruct
|
||||||
|
attr_accessor :_tglen, :_tg
|
||||||
|
def initialize(tglen, tg)
|
||||||
|
@_tglen = tglen
|
||||||
|
@_tg = tg
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class DfFlagarray < MemStruct
|
||||||
|
end
|
||||||
|
class DfArray < MemStruct
|
||||||
|
attr_accessor :_tglen, :_tg
|
||||||
|
def initialize(tglen, tg)
|
||||||
|
@_tglen = tglen
|
||||||
|
@_tg = tg
|
||||||
|
end
|
||||||
|
end
|
||||||
|
class DfLinkedList < MemStruct
|
||||||
|
attr_accessor :_tg
|
||||||
|
def initialize(tg)
|
||||||
|
@_tg = tg
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Global < MemStruct
|
||||||
|
attr_accessor :_glob
|
||||||
|
def initialize(glob)
|
||||||
|
@_glob = glob
|
||||||
|
end
|
||||||
|
def _at(addr) ; g = const_get(@_glob) ; g._at(addr) ; end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
require 'ruby-autogen'
|
Loading…
Reference in New Issue