Skip to content

Commit

Permalink
Showing 4 changed files with 215 additions and 0 deletions.
2 changes: 2 additions & 0 deletions corelib/opal.rb
Original file line number Diff line number Diff line change
@@ -18,6 +18,7 @@
require 'opal/time'
require 'opal/struct'
require 'opal/native'
require 'opal/io'

# regexp matches
$& = $~ = $` = $' = nil
@@ -27,6 +28,7 @@

# split lines
$/ = "\n"
$, = " "

# native global
$$ = $global = Native(`Opal.global`)
1 change: 1 addition & 0 deletions corelib/opal/error.rb
Original file line number Diff line number Diff line change
@@ -43,6 +43,7 @@ class IndexError < StandardError; end
class StopIteration < IndexError; end
class KeyError < IndexError; end
class RangeError < StandardError; end
class IOError < StandardError; end

class ScriptError < Exception; end
class SyntaxError < ScriptError; end
39 changes: 39 additions & 0 deletions corelib/opal/io.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
class IO
SEEK_SET = 0
SEEK_CUR = 1
SEEK_END = 2

module Writable
def <<(string)
write(string)

self
end

def print(*args)
write args.map { |arg| String(arg) }.join($,)
end

def puts(*args)
write args.map { |arg| String(arg) }.join($/)
end
end

module Readable
def readbyte
getbyte
end

def readchar
getc
end

def readline(sep = $/)
raise NotImplementedError
end

def readpartial(integer, outbuf = nil)
raise NotImplementedError
end
end
end
173 changes: 173 additions & 0 deletions stdlib/stringio.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
class StringIO < IO
include IO::Readable
include IO::Writable

def self.open(string = "", mode = nil, &block)
io = new(string, mode)
res = block.call(io)
io.close

res
end

attr_accessor :string

def initialize(string = "", mode = 'rw')
@string = string
@position = string.length

if mode.include?('r') and not mode.include?('w')
@closed = :write
elsif mode.include?('w') and not mode.include?('r')
@closed = :read
end
end

def eof?
check_readable

@position == @string.length
end

alias eof eof?

def seek(pos, whence = IO::SEEK_SET)
case whence
when IO::SEEK_SET
@position = pos

when IO::SEEK_CUR
if @position + pos > @string.length
@position = @string.length
else
@position += pos
end

when IO::SEEK_END
if pos > @string.length
@position = 0
else
@position -= pos
end
end

0
end

def tell
@position
end

alias pos tell

alias pos= seek

def rewind
seek 0
end

def each_byte(&block)
return enum_for :each_byte unless block

check_readable

i = @position
until eof?
block.call(@string[i].ord)
i += 1
end

self
end

def each_char(&block)
return enum_for :each_char unless block

check_readable

i = @position
until eof?
block.call(@string[i])
i += 1
end

self
end

def write(string)
check_writable

string = String(string)

if @string.length == @position
@string += string
else
before = @string[0 .. @position - 1]
after = @string[@position + string.length .. -1]

@string = before + string + after
end
end

def read(length = nil, outbuf = nil)
check_readable

return if eof?

string = if length
@string[@position, length]
else
@string[@position .. -1]
end

if outbuf
outbuf.write(string)
else
string
end
end

def close
@closed = :both
end

def close_read
if @closed == :write
@closed = :both
else
@closed = :read
end
end

def close_write
if @closed == :read
@closed = :both
else
@closed = :write
end
end

def closed?
@closed == :both
end

def closed_read?
@closed == :read || @closed == :both
end

def closed_write?
@closed == :write || @closed == :both
end

def check_writable
if closed_write?
raise IOError, "not opened for writing"
end
end

def check_readable
if closed_read?
raise IOError, "not opened for reading"
end
end
end

0 comments on commit 7df6016

Please sign in to comment.