X-Git-Url: http://nitlanguage.org diff --git a/lib/standard/file.nit b/lib/standard/file.nit index 5390293..903554c 100644 --- a/lib/standard/file.nit +++ b/lib/standard/file.nit @@ -2,6 +2,7 @@ # # Copyright 2004-2008 Jean Privat # Copyright 2008 Floréal Morandat +# Copyright 2008 Jean-Sébastien Gélinas # # This file is free software, which comes along with NIT. This software is # distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; @@ -22,28 +23,26 @@ redef class Object # Simple I/O # Print `objects' on the standard output (`stdout'). - protected meth printn(objects: Object...) + 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 meth print(object: Object) + protected fun print(object: Object) do - if object != null then - stdout.write(object.to_s) - end + stdout.write(object.to_s) stdout.write("\n") end # Read a character from the standard input (`stdin'). - protected meth getc: Char + protected fun getc: Char do return stdin.read_char.ascii end # Read a line from the standard input (`stdin'). - protected meth gets: String + protected fun gets: String do return stdin.read_line end @@ -51,26 +50,25 @@ end # File Abstract Stream class FStream -special IOS -special NativeFileCapable - + super IOS + super NativeFileCapable # The path of the file. - readable attr _path: String + readable var _path: nullable String = null # The FILE *. - attr _file: NativeFile + var _file: nullable NativeFile = null - meth file_stat: FileStat + fun file_stat: FileStat do return _file.file_stat end end # File input stream class IFStream -special FStream -special BufferedIStream + super FStream + super BufferedIStream # Misc - meth reopen + fun reopen do if not eof then close _file = io_open_read(_path.to_cstring) @@ -79,14 +77,14 @@ special BufferedIStream _buffer.clear end - redef meth close + redef fun close do var i = _file.io_close _end_reached = true end # Fill the internal read buffer. Needed by read operations. - redef meth fill_buffer + redef fun fill_buffer do var nb = _file.io_read(_buffer._items, _buffer._capacity) if nb <= 0 then @@ -98,7 +96,7 @@ special BufferedIStream end # End of file? - redef readable attr _end_reached: Bool + redef readable var _end_reached: Bool = false # Open the file at `path' for reading. init open(path: String) @@ -109,34 +107,35 @@ special BufferedIStream assert cant_open_file: _file != null end + private init do end private init without_file do end end # File output stream class OFStream -special FStream -special OStream + super FStream + super OStream # Write a string. - redef meth write(s) + redef fun write(s) do assert _writable write_native(s.to_cstring, s.length) end - redef meth is_writable do return _writable + redef fun is_writable do return _writable - redef meth close + redef fun close do var i = _file.io_close _writable = false end # Is the file open in write mode - attr _writable: Bool + var _writable: Bool # Write `len' bytes from `native'. - private meth write_native(native: NativeString, len: Int) + private fun write_native(native: NativeString, len: Int) do assert _writable var err = _file.io_write(native, len) @@ -155,13 +154,14 @@ special OStream _writable = true end + private init do end private init without_file do end end ############################################################################### class Stdin -special IFStream + super IFStream private init do _file = native_stdin _path = "/dev/stdin" @@ -170,7 +170,7 @@ special IFStream end class Stdout -special OFStream + super OFStream private init do _file = native_stdout _path = "/dev/stdout" @@ -179,7 +179,7 @@ special OFStream end class Stderr -special OFStream + super OFStream private init do _file = native_stderr _path = "/dev/stderr" @@ -191,11 +191,13 @@ end redef class String # return true if a file with this names exists - meth file_exists: Bool do return to_cstring.file_exists + fun file_exists: Bool do return to_cstring.file_exists + + fun file_stat: FileStat do return to_cstring.file_stat - meth file_stat: FileStat do return to_cstring.file_stat + fun file_delete: Bool do return to_cstring.file_delete - meth strip_extension(ext: String): String + fun strip_extension(ext: String): String do if has_suffix(ext) then return substring(0, length - ext.length) @@ -203,7 +205,7 @@ redef class String return self end - meth basename(ext: String): String + fun basename(ext: String): String do var pos = last_index_of_from('/', _length - 1) var n = self @@ -213,7 +215,7 @@ redef class String return n.strip_extension(ext) end - meth dirname: String + fun dirname: String do var pos = last_index_of_from('/', _length - 1) if pos >= 0 then @@ -223,7 +225,7 @@ redef class String end end - meth file_path: String + fun file_path: String do var l = _length var pos = last_index_of_from('/', l - 1) @@ -234,10 +236,10 @@ redef class String end # Create a directory (and all intermediate directories if needed) - meth mkdir + fun mkdir do var dirs = self.split_with("/") - var path = new String + var path = new Buffer if dirs.is_empty then return if dirs[0].is_empty then # it was a starting / @@ -247,49 +249,50 @@ redef class String if d.is_empty then continue path.append(d) path.add('/') - path.to_cstring.file_mkdir + path.to_s.to_cstring.file_mkdir end end end redef class NativeString - private meth file_exists: Bool is extern "string_NativeString_NativeString_file_exists_0" - private meth file_stat: FileStat is extern "string_NativeString_NativeString_file_stat_0" - private meth file_mkdir: Bool is extern "string_NativeString_NativeString_file_mkdir_0" + private fun file_exists: Bool is extern "string_NativeString_NativeString_file_exists_0" + private fun file_stat: FileStat is extern "string_NativeString_NativeString_file_stat_0" + private fun file_mkdir: Bool is extern "string_NativeString_NativeString_file_mkdir_0" + private fun file_delete: Bool is extern "string_NativeString_NativeString_file_delete_0" end universal FileStat -special Pointer + super Pointer # This class is system dependent ... must reify the vfs - meth mode: Int is extern "file_FileStat_FileStat_mode_0" - meth atime: Int is extern "file_FileStat_FileStat_atime_0" - meth ctime: Int is extern "file_FileStat_FileStat_ctime_0" - meth mtime: Int is extern "file_FileStat_FileStat_mtime_0" - meth size: Int is extern "file_FileStat_FileStat_size_0" + fun mode: Int is extern "file_FileStat_FileStat_mode_0" + fun atime: Int is extern "file_FileStat_FileStat_atime_0" + fun ctime: Int is extern "file_FileStat_FileStat_ctime_0" + fun mtime: Int is extern "file_FileStat_FileStat_mtime_0" + fun size: Int is extern "file_FileStat_FileStat_size_0" end # Instance of this class are standard FILE * pointers private universal NativeFile -special Pointer - meth io_read(buf: NativeString, len: Int): Int is extern "file_NativeFile_NativeFile_io_read_2" - meth io_write(buf: NativeString, len: Int): Int is extern "file_NativeFile_NativeFile_io_write_2" - meth io_close: Int is extern "file_NativeFile_NativeFile_io_close_0" - meth file_stat: FileStat is extern "file_NativeFile_NativeFile_file_stat_0" + super Pointer + fun io_read(buf: NativeString, len: Int): Int is extern "file_NativeFile_NativeFile_io_read_2" + fun io_write(buf: NativeString, len: Int): Int is extern "file_NativeFile_NativeFile_io_write_2" + fun io_close: Int is extern "file_NativeFile_NativeFile_io_close_0" + fun file_stat: FileStat is extern "file_NativeFile_NativeFile_file_stat_0" end -private class NativeFileCapable - meth io_open_read(path: NativeString): NativeFile is extern "file_NativeFileCapable_NativeFileCapable_io_open_read_1" - meth io_open_write(path: NativeString): NativeFile is extern "file_NativeFileCapable_NativeFileCapable_io_open_write_1" - meth native_stdin: NativeFile is extern "file_NativeFileCapable_NativeFileCapable_native_stdin_0" - meth native_stdout: NativeFile is extern "file_NativeFileCapable_NativeFileCapable_native_stdout_0" - meth native_stderr: NativeFile is extern "file_NativeFileCapable_NativeFileCapable_native_stderr_0" +private interface NativeFileCapable + fun io_open_read(path: NativeString): NativeFile is extern "file_NativeFileCapable_NativeFileCapable_io_open_read_1" + fun io_open_write(path: NativeString): NativeFile is extern "file_NativeFileCapable_NativeFileCapable_io_open_write_1" + fun native_stdin: NativeFile is extern "file_NativeFileCapable_NativeFileCapable_native_stdin_0" + fun native_stdout: NativeFile is extern "file_NativeFileCapable_NativeFileCapable_native_stdout_0" + fun native_stderr: NativeFile is extern "file_NativeFileCapable_NativeFileCapable_native_stderr_0" end # Standard input. -meth stdin: IFStream do return once new Stdin +fun stdin: IFStream do return once new Stdin # Standard output. -meth stdout: OFStream do return once new Stdout +fun stdout: OFStream do return once new Stdout # Standard output for error. -meth stderr: OFStream do return once new Stderr +fun stderr: OFStream do return once new Stderr