X-Git-Url: http://nitlanguage.org?ds=sidebyside diff --git a/lib/standard/file.nit b/lib/standard/file.nit index 3548a25..b081e84 100644 --- a/lib/standard/file.nit +++ b/lib/standard/file.nit @@ -135,7 +135,7 @@ class FileReader end # End of file? - redef var end_reached: Bool = false + redef var end_reached = false # Open the file at `path` for reading. # @@ -299,7 +299,7 @@ class Stdin prepare_buffer(1) end - redef fun poll_in: Bool is extern "file_stdin_poll_in" + redef fun poll_in is extern "file_stdin_poll_in" end # Standard output stream. @@ -767,11 +767,12 @@ redef class String return res end - # Simplify a file path by remove useless ".", removing "//", and resolving ".." + # Simplify a file path by remove useless `.`, removing `//`, and resolving `..` # - # * ".." are not resolved if they start the path - # * starting "/" is not removed - # * trailing "/" is removed + # * `..` are not resolved if they start the path + # * starting `.` is simplified unless the path is empty + # * starting `/` is not removed + # * trailing `/` is removed # # Note that the method only work on the string: # @@ -785,17 +786,29 @@ redef class String # assert "dir/..".simplify_path == "." # assert "//absolute//path/".simplify_path == "/absolute/path" # assert "//absolute//../".simplify_path == "/" + # assert "/".simplify_path == "/" + # assert "../".simplify_path == ".." + # assert "./".simplify_path == "." + # assert "././././././".simplify_path == "." + # assert "./../dir".simplify_path == "../dir" + # assert "./dir".simplify_path == "dir" # ~~~ fun simplify_path: String do var a = self.split_with("/") var a2 = new Array[String] for x in a do - if x == "." then continue - if x == "" and not a2.is_empty then continue + if x == "." and not a2.is_empty then continue # skip `././` + if x == "" and not a2.is_empty then continue # skip `//` if x == ".." and not a2.is_empty and a2.last != ".." then - a2.pop - continue + if a2.last == "." then # do not skip `./../` + a2.pop # reduce `./../` in `../` + else # reduce `dir/../` in `/` + a2.pop + continue + end + else if not a2.is_empty and a2.last == "." then + a2.pop # reduce `./dir` in `dir` end a2.push(x) end @@ -1056,12 +1069,12 @@ redef class NativeString struct stat* stat_element; int res; stat_element = malloc(sizeof(struct stat)); - res = lstat(recv, stat_element); + res = lstat(self, stat_element); if (res == -1) return NULL; return stat_element; `} private fun file_mkdir: Bool is extern "string_NativeString_NativeString_file_mkdir_0" - private fun rmdir: Bool `{ return !rmdir(recv); `} + private fun rmdir: Bool `{ return !rmdir(self); `} private fun file_delete: Bool is extern "string_NativeString_NativeString_file_delete_0" private fun file_chdir: Bool is extern "string_NativeString_NativeString_file_chdir_0" private fun file_realpath: NativeString is extern "file_NativeString_realpath" @@ -1081,19 +1094,19 @@ private extern class NativeFileStat `{ struct stat * `} fun size: Int is extern "file_FileStat_FileStat_size_0" # Returns true if it is a regular file (not a device file, pipe, sockect, ...) - fun is_reg: Bool `{ return S_ISREG(recv->st_mode); `} + fun is_reg: Bool `{ return S_ISREG(self->st_mode); `} # Returns true if it is a directory - fun is_dir: Bool `{ return S_ISDIR(recv->st_mode); `} + fun is_dir: Bool `{ return S_ISDIR(self->st_mode); `} # Returns true if it is a character device - fun is_chr: Bool `{ return S_ISCHR(recv->st_mode); `} + fun is_chr: Bool `{ return S_ISCHR(self->st_mode); `} # Returns true if it is a block device - fun is_blk: Bool `{ return S_ISBLK(recv->st_mode); `} + fun is_blk: Bool `{ return S_ISBLK(self->st_mode); `} # Returns true if the type is fifo - fun is_fifo: Bool `{ return S_ISFIFO(recv->st_mode); `} + fun is_fifo: Bool `{ return S_ISFIFO(self->st_mode); `} # Returns true if the type is a link - fun is_lnk: Bool `{ return S_ISLNK(recv->st_mode); `} + fun is_lnk: Bool `{ return S_ISLNK(self->st_mode); `} # Returns true if the type is a socket - fun is_sock: Bool `{ return S_ISSOCK(recv->st_mode); `} + fun is_sock: Bool `{ return S_ISSOCK(self->st_mode); `} end # Instance of this class are standard FILE * pointers @@ -1102,11 +1115,11 @@ private extern class NativeFile `{ FILE* `} fun io_write(buf: NativeString, len: Int): Int is extern "file_NativeFile_NativeFile_io_write_2" fun write_byte(value: Int): Int `{ unsigned char b = (unsigned char)value; - return fwrite(&b, 1, 1, recv); + return fwrite(&b, 1, 1, self); `} fun io_close: Int is extern "file_NativeFile_NativeFile_io_close_0" fun file_stat: NativeFileStat is extern "file_NativeFile_NativeFile_file_stat_0" - fun fileno: Int `{ return fileno(recv); `} + fun fileno: Int `{ return fileno(self); `} # Flushes the buffer, forcing the write operation fun flush: Int is extern "fflush" # Used to specify how the buffering will be handled for the current stream. @@ -1126,12 +1139,12 @@ private extern class NativeDir `{ DIR* `} new opendir(path: NativeString) `{ return opendir(path); `} # Close a directory - fun closedir `{ closedir(recv); `} + fun closedir `{ closedir(self); `} # Read the next directory entry fun readdir: NativeString `{ struct dirent *de; - de = readdir(recv); + de = readdir(self); if (!de) return NULL; return de->d_name; `} @@ -1182,7 +1195,6 @@ redef class Sys private fun intern_poll(in_fds: Array[Int], out_fds: Array[Int]) : nullable Int is extern import Array[Int].length, Array[Int].[], Int.as(nullable Int) `{ int in_len, out_len, total_len; struct pollfd *c_fds; - sigset_t sigmask; int i; int first_polled_fd = -1; int result; @@ -1236,7 +1248,7 @@ end # Print `objects` on the standard output (`stdout`). fun printn(objects: Object...) do - sys.stdout.write(objects.to_s) + sys.stdout.write(objects.plain_to_s) end # Print an `object` on the standard output (`stdout`) and add a newline.