X-Git-Url: http://nitlanguage.org diff --git a/lib/standard/file.nit b/lib/standard/file.nit index c36cc3b..0c6aed7 100644 --- a/lib/standard/file.nit +++ b/lib/standard/file.nit @@ -16,8 +16,8 @@ module file intrude import stream -intrude import ropes -import string_search +intrude import text::ropes +import text import time import gc @@ -77,9 +77,10 @@ abstract class FileStream # If the buf_size is <= 0, its value will be 512 by default # # The mode is any of the buffer_mode enumeration in `Sys`: - # - buffer_mode_full - # - buffer_mode_line - # - buffer_mode_none + # + # * `buffer_mode_full` + # * `buffer_mode_line` + # * `buffer_mode_none` fun set_buffering_mode(buf_size, mode: Int) do if buf_size <= 0 then buf_size = 512 if _file.set_buffering_type(buf_size, mode) != 0 then @@ -767,11 +768,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 +787,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 @@ -1182,7 +1196,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;