Skip to content
This repository has been archived by the owner on Sep 14, 2018. It is now read-only.

wi #6345 added IO#binread #31

Merged
merged 1 commit into from
Aug 14, 2011
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 31 additions & 1 deletion Languages/Ruby/Libraries/Builtins/IoOps.cs
Original file line number Diff line number Diff line change
Expand Up @@ -908,7 +908,7 @@ public static MutableString ReadNoBlock(RubyIO/*!*/ self, [DefaultProtocol]int b

#endregion

#region readchar, readbyte (1.9), readline, readlines
#region readchar, readbyte (1.9), readline, readlines, binread (1.9)

// returns a string in 1.9
[RubyMethod("readchar")]
Expand Down Expand Up @@ -1008,6 +1008,36 @@ public static int ReadChar(RubyIO/*!*/ self) {
}
}

[RubyMethod("binread", RubyMethodAttributes.PublicSingleton)]
public static MutableString/*!*/ Binread(
ConversionStorage<int>/*!*/ fixnumCast,
RubyClass/*!*/ self,
[DefaultProtocol, NotNull]MutableString path, [Optional]object optionalLength, [Optional, DefaultParameterValue(0)]int offset)
{
var site = fixnumCast.GetSite(ConvertToFixnumAction.Make(fixnumCast.Context));

bool useLengthParameter = (optionalLength != Missing.Value && optionalLength != null);
int length = useLengthParameter ? site.Target(site, optionalLength) : 0;

if (offset < 0)
throw RubyExceptions.CreateEINVAL();

if (useLengthParameter && length < 0)
throw RubyExceptions.CreateArgumentError("negative length {0} given", length);

using (RubyIO io = new RubyFile(self.Context, path.ToString(), IOMode.ReadOnly))
{
if (offset > 0)
io.Seek(offset, SeekOrigin.Begin);

if (useLengthParameter)
return Read(io, length, null);

return Read(io);
}
}


#endregion

#region getc, gets, ungetc, getbyte (1.9)
Expand Down
41 changes: 23 additions & 18 deletions Languages/Ruby/Libraries/Initializers.Generated.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2910,11 +2910,11 @@ private static void LoadIO_Instance(IronRuby.Builtins.RubyModule/*!*/ module) {
);

DefineLibraryMethod(module, "readlines", 0x51,
0x00000000U, 0x00000000U, 0x00020004U, 0x00060000U,
0x00060000U, 0x00000000U, 0x00000000U, 0x00020004U,
new Func<IronRuby.Runtime.RubyContext, IronRuby.Builtins.RubyIO, IronRuby.Builtins.MutableString, System.Int32, IronRuby.Builtins.RubyArray>(IronRuby.Builtins.RubyIOOps.ReadLines),
new Func<IronRuby.Runtime.RubyContext, IronRuby.Builtins.RubyIO, IronRuby.Builtins.RubyArray>(IronRuby.Builtins.RubyIOOps.ReadLines),
new Func<IronRuby.Runtime.RubyContext, IronRuby.Builtins.RubyIO, Microsoft.Scripting.Runtime.DynamicNull, IronRuby.Builtins.RubyArray>(IronRuby.Builtins.RubyIOOps.ReadLines),
new Func<IronRuby.Runtime.RubyContext, IronRuby.Builtins.RubyIO, IronRuby.Runtime.Union<IronRuby.Builtins.MutableString, System.Int32>, IronRuby.Builtins.RubyArray>(IronRuby.Builtins.RubyIOOps.ReadLines),
new Func<IronRuby.Runtime.RubyContext, IronRuby.Builtins.RubyIO, IronRuby.Builtins.MutableString, System.Int32, IronRuby.Builtins.RubyArray>(IronRuby.Builtins.RubyIOOps.ReadLines)
new Func<IronRuby.Runtime.RubyContext, IronRuby.Builtins.RubyIO, IronRuby.Runtime.Union<IronRuby.Builtins.MutableString, System.Int32>, IronRuby.Builtins.RubyArray>(IronRuby.Builtins.RubyIOOps.ReadLines)
);

DefineLibraryMethod(module, "reopen", 0x51,
Expand Down Expand Up @@ -3008,6 +3008,11 @@ private static void LoadIO_Instance(IronRuby.Builtins.RubyModule/*!*/ module) {
}

private static void LoadIO_Class(IronRuby.Builtins.RubyModule/*!*/ module) {
DefineLibraryMethod(module, "binread", 0x61,
0x00020004U,
new Func<IronRuby.Runtime.ConversionStorage<System.Int32>, IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.Object, System.Int32, IronRuby.Builtins.MutableString>(IronRuby.Builtins.RubyIOOps.Binread)
);

DefineLibraryMethod(module, "copy_stream", 0x61,
0x00000000U,
new Func<IronRuby.Runtime.ConversionStorage<IronRuby.Builtins.MutableString>, IronRuby.Runtime.ConversionStorage<System.Int32>, IronRuby.Runtime.RespondToStorage, IronRuby.Runtime.BinaryOpStorage, IronRuby.Runtime.CallSiteStorage<Func<System.Runtime.CompilerServices.CallSite, System.Object, System.Object, System.Object, System.Object>>, IronRuby.Builtins.RubyClass, System.Object, System.Object, System.Int32, System.Int32, System.Object>(IronRuby.Builtins.RubyIOOps.CopyStream)
Expand Down Expand Up @@ -4126,15 +4131,15 @@ private static void LoadKernel_Instance(IronRuby.Builtins.RubyModule/*!*/ module
);

DefineLibraryMethod(module, "define_singleton_method", 0x51,
new[] { 0x0002000cU, 0x0000000cU, 0x0002000cU, 0x0000000cU, 0x0004000aU, 0x0000000aU, 0x0002000cU, 0x0000000cU},
new[] { 0x0000000cU, 0x0002000cU, 0x0000000cU, 0x0002000cU, 0x0000000cU, 0x0004000aU, 0x0000000aU, 0x0002000cU},
new Func<IronRuby.Runtime.RubyScope, System.Object, IronRuby.Runtime.ClrName, IronRuby.Builtins.Proc, IronRuby.Builtins.Proc>(IronRuby.Builtins.KernelOps.DefineSingletonMethod),
new Func<IronRuby.Runtime.RubyScope, System.Object, System.String, IronRuby.Builtins.RubyMethod, IronRuby.Builtins.RubyMethod>(IronRuby.Builtins.KernelOps.DefineSingletonMethod),
new Func<IronRuby.Runtime.RubyScope, System.Object, IronRuby.Runtime.ClrName, IronRuby.Builtins.RubyMethod, IronRuby.Builtins.RubyMethod>(IronRuby.Builtins.KernelOps.DefineSingletonMethod),
new Func<IronRuby.Runtime.RubyScope, System.Object, System.String, IronRuby.Builtins.UnboundMethod, IronRuby.Builtins.UnboundMethod>(IronRuby.Builtins.KernelOps.DefineSingletonMethod),
new Func<IronRuby.Runtime.RubyScope, System.Object, IronRuby.Runtime.ClrName, IronRuby.Builtins.UnboundMethod, IronRuby.Builtins.UnboundMethod>(IronRuby.Builtins.KernelOps.DefineSingletonMethod),
new Func<IronRuby.Runtime.RubyScope, IronRuby.Runtime.BlockParam, System.Object, System.String, IronRuby.Builtins.Proc>(IronRuby.Builtins.KernelOps.DefineSingletonMethod),
new Func<IronRuby.Runtime.RubyScope, IronRuby.Runtime.BlockParam, System.Object, IronRuby.Runtime.ClrName, IronRuby.Builtins.Proc>(IronRuby.Builtins.KernelOps.DefineSingletonMethod),
new Func<IronRuby.Runtime.RubyScope, System.Object, System.String, IronRuby.Builtins.Proc, IronRuby.Builtins.Proc>(IronRuby.Builtins.KernelOps.DefineSingletonMethod),
new Func<IronRuby.Runtime.RubyScope, System.Object, IronRuby.Runtime.ClrName, IronRuby.Builtins.Proc, IronRuby.Builtins.Proc>(IronRuby.Builtins.KernelOps.DefineSingletonMethod)
new Func<IronRuby.Runtime.RubyScope, System.Object, System.String, IronRuby.Builtins.Proc, IronRuby.Builtins.Proc>(IronRuby.Builtins.KernelOps.DefineSingletonMethod)
);

DefineLibraryMethod(module, "display", 0x51,
Expand Down Expand Up @@ -6697,11 +6702,11 @@ private static void LoadString_Instance(IronRuby.Builtins.RubyModule/*!*/ module
);

DefineLibraryMethod(module, "each_line", 0x51,
0x00000000U, 0x00000002U, 0x00010000U, 0x00020001U,
new Func<IronRuby.Runtime.RubyContext, IronRuby.Builtins.MutableString, IronRuby.Builtins.Enumerator>(IronRuby.Builtins.MutableStringOps.EachLine),
0x00000002U, 0x00010000U, 0x00020001U, 0x00000000U,
new Func<IronRuby.Runtime.RubyContext, IronRuby.Runtime.BlockParam, IronRuby.Builtins.MutableString, System.Object>(IronRuby.Builtins.MutableStringOps.EachLine),
new Func<IronRuby.Builtins.MutableString, IronRuby.Builtins.MutableString, IronRuby.Builtins.Enumerator>(IronRuby.Builtins.MutableStringOps.EachLine),
new Func<IronRuby.Runtime.BlockParam, IronRuby.Builtins.MutableString, IronRuby.Builtins.MutableString, System.Object>(IronRuby.Builtins.MutableStringOps.EachLine)
new Func<IronRuby.Runtime.BlockParam, IronRuby.Builtins.MutableString, IronRuby.Builtins.MutableString, System.Object>(IronRuby.Builtins.MutableStringOps.EachLine),
new Func<IronRuby.Runtime.RubyContext, IronRuby.Builtins.MutableString, IronRuby.Builtins.Enumerator>(IronRuby.Builtins.MutableStringOps.EachLine)
);

DefineLibraryMethod(module, "empty?", 0x51,
Expand Down Expand Up @@ -6812,11 +6817,11 @@ private static void LoadString_Instance(IronRuby.Builtins.RubyModule/*!*/ module
);

DefineLibraryMethod(module, "lines", 0x51,
0x00000000U, 0x00000002U, 0x00010000U, 0x00020001U,
new Func<IronRuby.Runtime.RubyContext, IronRuby.Builtins.MutableString, IronRuby.Builtins.Enumerator>(IronRuby.Builtins.MutableStringOps.EachLine),
0x00000002U, 0x00010000U, 0x00020001U, 0x00000000U,
new Func<IronRuby.Runtime.RubyContext, IronRuby.Runtime.BlockParam, IronRuby.Builtins.MutableString, System.Object>(IronRuby.Builtins.MutableStringOps.EachLine),
new Func<IronRuby.Builtins.MutableString, IronRuby.Builtins.MutableString, IronRuby.Builtins.Enumerator>(IronRuby.Builtins.MutableStringOps.EachLine),
new Func<IronRuby.Runtime.BlockParam, IronRuby.Builtins.MutableString, IronRuby.Builtins.MutableString, System.Object>(IronRuby.Builtins.MutableStringOps.EachLine)
new Func<IronRuby.Runtime.BlockParam, IronRuby.Builtins.MutableString, IronRuby.Builtins.MutableString, System.Object>(IronRuby.Builtins.MutableStringOps.EachLine),
new Func<IronRuby.Runtime.RubyContext, IronRuby.Builtins.MutableString, IronRuby.Builtins.Enumerator>(IronRuby.Builtins.MutableStringOps.EachLine)
);

DefineLibraryMethod(module, "ljust", 0x51,
Expand Down Expand Up @@ -6877,10 +6882,10 @@ private static void LoadString_Instance(IronRuby.Builtins.RubyModule/*!*/ module
);

DefineLibraryMethod(module, "rindex", 0x51,
0x00040004U, 0x00010002U, 0x00030002U,
new Func<IronRuby.Runtime.RubyScope, IronRuby.Builtins.MutableString, IronRuby.Builtins.RubyRegex, System.Int32, System.Object>(IronRuby.Builtins.MutableStringOps.LastIndexOf),
0x00010002U, 0x00030002U, 0x00040004U,
new Func<IronRuby.Builtins.MutableString, IronRuby.Builtins.MutableString, System.Object>(IronRuby.Builtins.MutableStringOps.LastIndexOf),
new Func<IronRuby.Builtins.MutableString, IronRuby.Builtins.MutableString, System.Int32, System.Object>(IronRuby.Builtins.MutableStringOps.LastIndexOf)
new Func<IronRuby.Builtins.MutableString, IronRuby.Builtins.MutableString, System.Int32, System.Object>(IronRuby.Builtins.MutableStringOps.LastIndexOf),
new Func<IronRuby.Runtime.RubyScope, IronRuby.Builtins.MutableString, IronRuby.Builtins.RubyRegex, System.Int32, System.Object>(IronRuby.Builtins.MutableStringOps.LastIndexOf)
);

DefineLibraryMethod(module, "rjust", 0x51,
Expand Down Expand Up @@ -11232,12 +11237,12 @@ private static void LoadBigDecimal_Instance(IronRuby.Builtins.RubyModule/*!*/ mo
);

DefineLibraryMethod(module, "<=>", 0x11,
new[] { 0x00000002U, 0x00000004U, 0x00000000U, 0x00000000U, 0x00000000U},
new[] { 0x00000000U, 0x00000002U, 0x00000004U, 0x00000000U, 0x00000000U},
new Func<IronRuby.Runtime.BinaryOpStorage, IronRuby.Runtime.BinaryOpStorage, IronRuby.StandardLibrary.BigDecimal.BigDecimal, System.Object, System.Object>(IronRuby.StandardLibrary.BigDecimal.BigDecimalOps.Compare),
new Func<IronRuby.StandardLibrary.BigDecimal.BigDecimal, IronRuby.StandardLibrary.BigDecimal.BigDecimal, System.Object>(IronRuby.StandardLibrary.BigDecimal.BigDecimalOps.Compare),
new Func<IronRuby.Runtime.RubyContext, IronRuby.StandardLibrary.BigDecimal.BigDecimal, Microsoft.Scripting.Math.BigInteger, System.Object>(IronRuby.StandardLibrary.BigDecimal.BigDecimalOps.Compare),
new Func<IronRuby.Runtime.RubyContext, IronRuby.StandardLibrary.BigDecimal.BigDecimal, System.Int32, System.Object>(IronRuby.StandardLibrary.BigDecimal.BigDecimalOps.Compare),
new Func<IronRuby.Runtime.RubyContext, IronRuby.StandardLibrary.BigDecimal.BigDecimal, System.Double, System.Object>(IronRuby.StandardLibrary.BigDecimal.BigDecimalOps.Compare),
new Func<IronRuby.Runtime.BinaryOpStorage, IronRuby.Runtime.BinaryOpStorage, IronRuby.StandardLibrary.BigDecimal.BigDecimal, System.Object, System.Object>(IronRuby.StandardLibrary.BigDecimal.BigDecimalOps.Compare)
new Func<IronRuby.Runtime.RubyContext, IronRuby.StandardLibrary.BigDecimal.BigDecimal, System.Double, System.Object>(IronRuby.StandardLibrary.BigDecimal.BigDecimalOps.Compare)
);

DefineLibraryMethod(module, "==", 0x11,
Expand Down
39 changes: 39 additions & 0 deletions Languages/Ruby/Tests/mspec/rubyspec/core/io/binread_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# -*- encoding: utf-8 -*-
require File.expand_path('../../../spec_helper', __FILE__)
require File.expand_path('../fixtures/classes', __FILE__)

ruby_version_is "1.9" do
describe "IO.binread" do
before :each do
@fname = tmp('io_read.txt')
@contents = "1234567890"
touch(@fname) { |f| f.write @contents }
end

after :each do
rm_r @fname
end

it "reads the contents of a file" do
IO.binread(@fname).should == @contents
end

it "reads the contents of a file up to a certain size when specified" do
IO.binread(@fname, 5).should == @contents.slice(0..4)
end

it "reads the contents of a file from an offset of a specific size when specified" do
IO.binread(@fname, 5, 3).should == @contents.slice(3, 5)
end

it "raises an ArgumentError when not passed a valid length" do
lambda { IO.binread @fname, -1 }.should raise_error(ArgumentError)
end

it "raises an Errno::EINVAL when not passed a valid offset" do
lambda { IO.binread @fname, 0, -1 }.should raise_error(Errno::EINVAL)
end

it "needs to be reviewed for spec completeness"
end
end