--[[ Copyright (c) 2012 Kaarle Ritvanen See LICENSE file for license details --]] module(..., package.seeall) require 'stringy' local function filter(func, tbl) local res = {} for k, v in pairs(tbl) do if func(v) then res[k] = v end end return res end function is_absolute(path) return string.sub(path, 1, 1) == '/' end function to_absolute(path, base) if not is_absolute(path) then path = base..(base ~= '/' and '/' or '')..path end local comps = split(path) local i = 1 while i <= #comps do if comps[i] == '..' then if i == 1 then error('Invalid path: '..path) end table.remove(comps, i - 1) table.remove(comps, i - 1) i = i - 1 else i = i + 1 end end return '/'..table.concat(comps, '/') end function join(p1, p2, ...) if not p2 then return p1 end if not is_absolute(p2) then p2 = '/'..p2 end return join((p1 == '/' and '' or p1)..p2, unpack(arg)) end function split(path) -- assume absolute paths assert(is_absolute(path)) if path == '/' then return {} end return filter(function(s) return s > '' end, stringy.split(string.sub(path, 2, -1), '/')) end function parent(path) local comps = split(path) table.remove(comps) return join('/', unpack(comps)) end function name(path) local comps = split(path) return comps[#comps] end