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