RubyでHSPのオブジェクトファイルのインスペクタを作り中
TYPENAMES = %w( TYPE_MARK TYPE_VAR TYPE_STRING TYPE_DNUM TYPE_INUM TYPE_STRUCT TYPE_XLABEL TYPE_LABEL TYPE_INTCMD TYPE_EXTCMD TYPE_EXTSYSVAR TYPE_CMPCMD TYPE_MODCMD TYPE_INTFUNC TYPE_SYSVAR TYPE_PROGCMD TYPE_DLLFUNC TYPE_DLLCTRL TYPE_USERDEF ) TYPENAMES.each_with_index do |typename, i| Object.const_set( typename, i ) end obj = ARGF.read pt_cs, max_cs, pt_ds, max_ds = *obj[16,16].unpack('i4') cs = obj[pt_cs,max_cs] ds = obj[pt_ds,max_ds] i = 0 while i < max_cs c = *cs[i,2].unpack('s') type = c & 0x1fff ex1 = c & 0x2000 != 0 ex2 = c & 0x4000 != 0 if big_flag = c & 0x8000 != 0 code = *cs[i+2,4].unpack('i') else code = *cs[i+2,2].unpack('s') end print "#{TYPENAMES[type]}" case type when TYPE_STRING puts "(%p)" % ds[code..-1].split("\0")[0] else puts end if big_flag i += 2 + 4 else i += 2 + 2 end end
mes "hello, world!"のオブジェクトファイルをこれに渡したら
TYPE_EXTCMD TYPE_STRING("hello, world!") TYPE_PROGCMD TYPE_PROGCMD TYPE_LABEL
と出るところまで。