davispuh/ruby-libmspack

View on GitHub
lib/libmspack/system.rb

Summary

Maintainability
A
0 mins
Test Coverage
module LibMsPack
    module RubySystem

        MsPack::RubyPackSystem.open = FFI::Function.new(MsPack::MsPackFile.ptr, [ MsPack::MsPackSystem.ptr, :string, :int ]) do |system, filename, mode|
            case mode
            when LibMsPack::MSPACK_SYS_OPEN_READ
                fmode = "rb"
            when LibMsPack::MSPACK_SYS_OPEN_WRITE
                fmode = "wb"
            when LibMsPack::MSPACK_SYS_OPEN_UPDATE
                fmode = "r+b"
            when LibMsPack::MSPACK_SYS_OPEN_APPEND
                fmode = "ab"
            else
                return nil
            end

            file = MsPack::MsPackFile.new
            file.name = filename
            file.file = File.new(filename, fmode)
            file
        end

        MsPack::RubyPackSystem.close = FFI::Function.new(:void, [ MsPack::MsPackFile.ptr ]) do |file|
            return nil unless file
            file.file.close if file.file
            file.file = nil
            file.name = nil
            file = nil
        end

        MsPack::RubyPackSystem.read = FFI::Function.new(:int, [ MsPack::MsPackFile.ptr, :buffer_inout, :int ]) do |file, buffer, bytes|
            return -1 if file.nil? or buffer.nil? or bytes.nil? or bytes < 0
            file.file.read(bytes, buffer)
        end

        MsPack::RubyPackSystem.write = FFI::Function.new(:int, [ MsPack::MsPackFile.ptr, :buffer_inout, :int ]) do |file, buffer, bytes|
            return -1 if file.nil? or buffer.nil? or bytes.nil? or bytes < 0
            file.file.write(buffer.get_string(bytes))
        end

        MsPack::RubyPackSystem.seek = FFI::Function.new(:int, [ MsPack::MsPackFile.ptr, :off_t, :int ]) do |file, offset, mode|
            return nil unless file
            case mode
            when LibMsPack::MSPACK_SYS_SEEK_START
                fmode = IO::SEEK_START
            when LibMsPack::MSPACK_SYS_SEEK_CUR
                fmode = IO::SEEK_CUR
            when LibMsPack::MSPACK_SYS_SEEK_END
                fmode = IO::SEEK_END
            else
                return nil
            end
            file.file.seek(offset, fmode)
        end

        MsPack::RubyPackSystem.tell = FFI::Function.new(:int, [ MsPack::MsPackFile.ptr ]) do |file|
            return nil unless file
            file.tell
        end

        MsPack::RubyPackSystem.message = FFI::Function.new(:int, [ MsPack::MsPackFile.ptr, :string, :varargs ]) do |file, format, vars|
            $stderr.puts file.name if file
            $stderr.printf(format, vars)
            $stderr.puts
            $stderr.flush
        end

        MsPack::RubyPackSystem.alloc = FFI::Function.new(:pointer, [ :size_t ]) do |bytes|
            FFI::MemoryPointer.new(bytes)
        end

        MsPack::RubyPackSystem.free = FFI::Function.new(:void, [ :pointer ]) do |buffer|
            buffer.free
            buffer = nil
        end

        MsPack::RubyPackSystem.copy = FFI::Function.new(:void, [ :buffer_in, :buffer_out, :size_t ]) do |src, dst, bytes|
            dst.write_string(src.read_string(bytes), bytes)
        end

        MsPack::RubyPackSystem.copy = nil
    end
end