module FileInputMixin def fgetb ret = 0 each_byte do |i| ret = i || 0 break end return ret end def fgetw x = 0 ret = 0 each_byte do |i| break if !i ret |= (i << x) x += 8 break if x == 16 end return ret end def fgetdw x = 0 ret = 0 each_byte do |i| break if !i ret |= (i << x) x += 8 break if x == 32 end return ret end def fgetsb ret = fgetb ret -= 256 if (ret & 0x80) != 0 return ret end def xfgetb(offset) self.pos = offset return fgetb end def xfgetw(offset) self.pos = offset return fgetw end def xfgetdw(offset) self.pos = offset return fgetdw end def getOffset(index) self.binmode self.pos = 0 offset = fgetdw >> 3 return 0 if index >= offset self.pos = index * 8 return fgetdw end def getLength(index) self.binmode self.pos = 0 offset = fgetdw >> 3 return 0 if index >= offset self.pos = index * 8 + 4 return fgetdw end def readName(index) self.binmode self.pos = 0 offset = fgetdw >> 3 return "" if index >= offset self.pos = index << 3 offset = fgetdw length = fgetdw return "" if length == 0 self.pos = offset return read(length) end end module FileOutputMixin def fputb(b) b &= 0xFF write(b.chr) end def fputw(w) 2.times do b = w & 0xFF write(b.chr) w >>= 8 end end def fputdw(w) 4.times do b = w & 0xFF write(b.chr) w >>= 8 end end end class File < IO =begin unless defined?(debugopen) class << self alias debugopen open end end def open(f, m = "r") debugopen("debug.txt", "ab") { |file| file.write([f, m, Time.now.to_f].inspect + "\r\n") } if block_given? debugopen(f, m) { |file| yield file } else return debugopen(f, m) end end =end include FileInputMixin include FileOutputMixin end class StringInput include FileInputMixin def pos=(value) seek(value) end def each_byte while !eof? yield getc end end def binmode; end end class StringOutput include FileOutputMixin end