1module IRB
2  class << (MagicFile = Object.new)
3    # see parser_magic_comment in parse.y
4    ENCODING_SPEC_RE = %r"coding\s*[=:]\s*([[:alnum:]\-_]+)"
5
6    def open(path)
7      io = File.open(path, 'rb')
8      line = io.gets
9      line = io.gets if line[0,2] == "#!"
10      encoding = detect_encoding(line)
11      internal_encoding = encoding
12      encoding ||= default_src_encoding
13      io.rewind
14      io.set_encoding(encoding, internal_encoding)
15
16      if block_given?
17        begin
18          return (yield io)
19        ensure
20          io.close
21        end
22      else
23        return io
24      end
25    end
26
27    private
28    def detect_encoding(line)
29      return unless line[0] == ?#
30      line = line[1..-1]
31      line = $1 if line[/-\*-\s*(.*?)\s*-*-$/]
32      return nil unless ENCODING_SPEC_RE =~ line
33      encoding = $1
34      return encoding.sub(/-(?:mac|dos|unix)/i, '')
35    end
36  end
37end
38