# stringfile.rb
# Copyright (C) by GFD-Dennou Club, 2002.  All rights reserved.

=begin
= class StringFile
* String を継承。
あたかもファイルのように逐次読取りができる文字列。
=end

module NumRu
  class StringFile < String

=begin
== クラスメソッド
--- StringFile::new(string)
    文字列 string をコピーして新しい StringFile を作成して返す。
    現在位置を 0 とする。
=end

    def initialize str
        super
	@pos = 0
    end

=begin
== インスタンスメソッド
--- rewind
    現在位置を 0 に戻す。
--- pos
    現在位置を返す。
--- pos= n
    現在位置を ((|n|)) に設定する。
=end

    def rewind; @pos = 0; end
    attr_accessor :pos

=begin
--- read (n = nil)
    現在位置から ((|n|)) バイトを返し、
    ((|n|)) を省略した場合は現在位置以降のすべての文字列を返す。
    現在位置は返された文字列の長さだけ進められる。
    現在位置が終端にある場合、または現在位置が終端を越えて進められる時には
    ((<EOFError>)) 例外を起こす。
=end

    def read (n = nil)
	fail EOFError if @pos >= self.size
    	if n.nil? then
	    p = @pos
	    q = ((@pos = self.size) - p)
	    return self[p, q]
	end
    	@pos += n
	fail EOFError if @pos > self.size
    	self[@pos - n, n]
    end

=begin
--- read_int24
    現在位置から ((<read>)) で 3 バイトを読みとり、
    ビッグエンディアン語順で整数に替える。
=end

    def read_int24
	("\0" + read(3)).unpack('N').first
    end

  end
end
