You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
1.7 KiB
71 lines
1.7 KiB
8 years ago
|
-- see copyright notice in grldc.h
|
||
|
|
||
|
local string = string
|
||
|
local assert = assert
|
||
|
local print = print
|
||
|
|
||
|
module( "grldc.utilities" )
|
||
|
|
||
|
function normalizePath( path, base )
|
||
|
--print( "Normalizing "..path )
|
||
|
assert( string.sub( path, 1, 1 ) ~= "@" )
|
||
|
local n
|
||
|
|
||
|
path = string.gsub(path, "\\", "/")
|
||
|
path = string.lower( path )
|
||
|
|
||
|
--make sure the drive letter, if any, is upper case
|
||
|
if string.find(path, "^.:/") == 1 then
|
||
|
path = string.upper(string.sub(path, 1, 1))..string.sub(path, 2)
|
||
|
elseif string.sub( path, 1, 1 ) == "/" then
|
||
|
-- absolute linux-style path, nothing to do
|
||
|
elseif string.sub( path, 1, 2 ) == "./" then
|
||
|
-- explicit relative path, nothing to do
|
||
|
else
|
||
|
path = "./"..path
|
||
|
end
|
||
|
|
||
|
if string.sub( path, 1, 2 ) == "./" and base ~= nil then
|
||
|
-- if the lfs module is available, we convert relative path to absolute
|
||
|
path = base..string.sub( path, 2 )
|
||
|
path = string.gsub(path, "\\", "/")
|
||
|
end
|
||
|
|
||
|
--add end "/" if needed (simplifies pattern matchings below)
|
||
|
if string.sub(path, -1) ~= "/" then
|
||
|
path = path.."/"
|
||
|
end
|
||
|
|
||
|
--replace "//" by "/"
|
||
|
n = 1
|
||
|
while n > 0 do
|
||
|
path, n = string.gsub(path, "//", "/", 1)
|
||
|
end
|
||
|
|
||
|
--replace "/./" by "/"
|
||
|
n = 1
|
||
|
while n > 0 do
|
||
|
path, n = string.gsub(path, "/%./", "/", 1)
|
||
|
end
|
||
|
|
||
|
--replace "/something/../" by "/"
|
||
|
n = 1
|
||
|
while n > 0 do
|
||
|
n = 0
|
||
|
local s = 0, e
|
||
|
local something = ".."
|
||
|
while something == ".." do
|
||
|
s, e, something = string.find( path, "/([^/]*)/%.%./", s+1 )
|
||
|
end
|
||
|
if s ~= nil then
|
||
|
n = 1
|
||
|
path = string.sub( path, 1, s-1 ).."/"..string.sub( path, e+1 )
|
||
|
end
|
||
|
end
|
||
|
|
||
|
path = string.sub( path, 1, -2 ) -- remove end "/"
|
||
|
--print( path )
|
||
|
|
||
|
return path
|
||
|
end
|