Change soft-fail to use the config, rather than env
[rbx.git] / kernel / platform / file.rb
blobc0551fcaf3cfacb6fb02c41782098301f3306e30
1 # depends on: ffi.rb
3 ##
4 # Platform specific behavior for the File class.
6 module Platform::File
7   SEPARATOR = '/'
8   ALT_SEPARATOR = nil
9   PATH_SEPARATOR = ':'
11   def self.dirname(path)
12     if(!path.match(/#{SEPARATOR}/) || path.match(/^\.+#{SEPARATOR}+$/))
13       return "."
14     else
15       # strip the basename off the end and clean up the ending separators
16       path = path.sub(/#{SEPARATOR}*[^#{SEPARATOR}]*#{SEPARATOR}*$/,'')
17       if(path == '')
18         return SEPARATOR
19       else
20         return path
21       end
22     end
23   end
25   def self.basename(path,ext)
26     path.gsub!(/([^#{SEPARATOR}])#{SEPARATOR}\z/, "\\1")
27     basename = if(m = path.match(/#{SEPARATOR}+([^#{SEPARATOR}]*)#{SEPARATOR}*$/))
28                  m[1] == '' ? SEPARATOR : m[1]
29                else
30                  path
31                end
32     ext = Regexp.quote(ext) # convert everything to literal characters
33     ext.sub!(/\\\*/,'[^\.]+?') # convert .*'s back into a general match expression
34     return basename.sub(/#{ext}$/,'')
35   end
37   # FIXME: this is awful
38   def self.expand_path(path, dir_string = nil)
39     path = StringValue(path)
40     if(dir_string.nil?)
41       dir_string = Dir.pwd
42     else
43       dir_string = StringValue(dir_string)
44     end
46     path.gsub!(/~(#{ENV['USER']})/, "~/")
48     raise ArgumentError, "user #{path}" if path.match(/~([^\/])/)
50     if(dir_string.empty?)
51       dir_string = Dir.pwd
52     elsif(dir_string[0].chr == '~')
53       dir_string = ENV['HOME'] + dir_string[1..-1]
54     elsif(dir_string[0].chr != '/')
55       dir_string = Dir.pwd + "/" + dir_string
56     end
58     dirs = path.split('/')
59     if path == '' || (dirs.empty? && path[0].chr != '/')
60       return dir_string
61     else
62       first = case dirs.first
63               when '..'; dir_string.split('/')[0...-1].join('/')
64               when '~'; ENV['HOME']
65               when '.'; dir_string
66               when ''; '/'
67               when nil;
68                 match = /(\/+)/.match(path)
69                 prefix = match[0] if match
70                 ''
71               else
72                 dir_string + '/' + dirs.first
73               end
75       dirs.shift
76       paths = first.split('/')
77       dirs.each do |dir|
78         next if dir == '.' || dir == ''
79         dir == '..' ? paths.pop : paths.push(dir)
80       end
81       string = paths.empty? ? '' : paths.join("/")
82       return !string.empty? && string[0].chr == '/' ? string : prefix || '/' +string
83     end
84   end
85 end