Merge: Distinguish top-level methods
[nit.git] / lib / standard / file.nit
index 0b5fd04..b797da1 100644 (file)
@@ -16,7 +16,7 @@
 module file
 
 intrude import stream
-intrude import string
+intrude import ropes
 import string_search
 import time
 
@@ -28,39 +28,6 @@ in "C Header" `{
        #include <unistd.h>
 `}
 
-redef class Object
-# Simple I/O
-
-       # Print `objects` on the standard output (`stdout`).
-       protected fun printn(objects: Object...)
-       do
-               stdout.write(objects.to_s)
-       end
-
-       # Print an `object` on the standard output (`stdout`) and add a newline.
-       protected fun print(object: Object)
-       do
-               stdout.write(object.to_s)
-               stdout.write("\n")
-       end
-
-       # Read a character from the standard input (`stdin`).
-       protected fun getc: Char
-       do
-               return stdin.read_char.ascii
-       end
-
-       # Read a line from the standard input (`stdin`).
-       protected fun gets: String
-       do
-               return stdin.read_line
-       end
-
-       # Return the working (current) directory
-       protected fun getcwd: String do return file_getcwd.to_s
-       private fun file_getcwd: NativeString is extern "string_NativeString_NativeString_file_getcwd_0"
-end
-
 # File Abstract Stream
 abstract class FStream
        super IOS
@@ -117,7 +84,9 @@ class IFStream
                self.path = path
                prepare_buffer(10)
                _file = new NativeFile.io_open_read(path.to_cstring)
-               assert cant_open_file: _file != null
+               assert not _file.address_is_null else
+                       print "Error: Opening file at '{path}' failed with '{sys.errno.strerror}'"
+               end
        end
 
        private init do end
@@ -132,7 +101,11 @@ class OFStream
        redef fun write(s)
        do
                assert _writable
-               write_native(s.to_cstring, s.length)
+               if s isa FlatText then
+                       write_native(s.to_cstring, s.length)
+               else
+                       for i in s.substrings do write_native(i.to_cstring, i.length)
+               end
        end
 
        redef fun is_writable do return _writable
@@ -161,7 +134,9 @@ class OFStream
        init open(path: String)
        do
                _file = new NativeFile.io_open_write(path.to_cstring)
-               assert cant_open_file: _file != null
+               assert not _file.address_is_null else
+                       print "Error: Opening file at '{path}' failed with '{sys.errno.strerror}'"
+               end
                self.path = path
                _writable = true
        end
@@ -174,15 +149,15 @@ end
 
 class Stdin
        super IFStream
+       super PollableIStream
+
        private init do
                _file = new NativeFile.native_stdin
                path = "/dev/stdin"
                prepare_buffer(1)
        end
 
-       # Is these something to read? (non blocking)
-       # FIXME: should be generalized
-       fun poll_in: Bool is extern "file_stdin_poll_in"
+       redef fun poll_in: Bool is extern "file_stdin_poll_in"
 end
 
 class Stdout
@@ -520,11 +495,44 @@ private extern class NativeFile `{ FILE* `}
        new native_stderr is extern "file_NativeFileCapable_NativeFileCapable_native_stderr_0"
 end
 
-# Standard input.
-fun stdin: Stdin do return once new Stdin
+redef class Sys
+
+       # Standard input
+       var stdin: PollableIStream protected writable = new Stdin
+
+       # Standard output
+       var stdout: OStream protected writable = new Stdout
+
+       # Standard output for errors
+       var stderr: OStream protected writable = new Stderr
+
+end
+
+# Print `objects` on the standard output (`stdout`).
+protected fun printn(objects: Object...)
+do
+       sys.stdout.write(objects.to_s)
+end
+
+# Print an `object` on the standard output (`stdout`) and add a newline.
+protected fun print(object: Object)
+do
+       sys.stdout.write(object.to_s)
+       sys.stdout.write("\n")
+end
+
+# Read a character from the standard input (`stdin`).
+protected fun getc: Char
+do
+       return sys.stdin.read_char.ascii
+end
 
-# Standard output.
-fun stdout: OFStream do return once new Stdout
+# Read a line from the standard input (`stdin`).
+protected fun gets: String
+do
+       return sys.stdin.read_line
+end
 
-# Standard output for error.
-fun stderr: OFStream do return once new Stderr
+# Return the working (current) directory
+protected fun getcwd: String do return file_getcwd.to_s
+private fun file_getcwd: NativeString is extern "string_NativeString_NativeString_file_getcwd_0"