Compare commits

..

No commits in common. "rewrite-pathlib" and "master" have entirely different histories.

2 changed files with 122 additions and 121 deletions

View File

@ -1,124 +1,149 @@
local PathObj = {} local path = {}
local posix_separator = '/' function path.Common_Root( Left, Right, Separator )
local windows_separator = '\\' local Sep = Separator or "/"
local smallest_string = nil
local function split( s, sep, include_sep ) local largest_string = nil
local include = include_sep or false if string.len(Left) > string.len(Right) then
local fields, index = {}, 1 smallest_string = Right
repeat largest_string = Left
local occurence = s:find(sep, index, true)
if include == true then
fields[#fields + 1] = s:sub(index - 1, occurence and occurence - 1)
else else
fields[#fields + 1] = s:sub(index, occurence and occurence - 1) smallest_string = Left
end largest_string = Right
index = occurence and occurence + #sep
until not index
return fields
end end
local function slice( t, first, last, step ) local last_sep_idx = 1
local sliced = {} local sep = string.byte(Sep)
for i = 1, #smallest_string do
local first_index = first or 1 if smallest_string:byte(i) == sep then
local last_index = last or #t last_sep_idx = i
local step_size = step or 1
for i = first_index, last_index, step_size do
sliced[#sliced + 1] = t[i]
end end
return sliced if smallest_string:byte(i) ~= largest_string:byte(i) then
end
function PathObj:new( path )
local obj = {}
local path_blocks = split(path, posix_separator)
local slash_count = 0
for i, part in ipairs(path_blocks) do
if part == '' then
slash_count = slash_count + 1
else
break break
end end
end end
if slash_count == 0 then local match = string.sub(smallest_string, 1, last_sep_idx - 1)
obj.root = ''
elseif slash_count == 2 then if match == '' then
obj.root = posix_separator .. posix_separator return nil
path_blocks = slice(path_blocks, 3)
else else
obj.root = posix_separator return match
path_blocks = slice(path_blocks, slash_count + 1) end
end end
if obj.root ~= '' then function path.Get_Extension( P )
obj.parts = {obj.root, table.unpack(path_blocks)} if P == nil then
return nil
end
local rev_string = string.reverse(P)
local start_idx = 0
local end_idx = 0
start_idx, end_idx = string.find(rev_string, ".", 1, true)
if start_idx == nil then
return nil
else else
obj.parts = path_block return string.sub(P, #P - (start_idx -2))
end
end end
obj.drive = '' function path.Get_Extension_From_List( P, Extension_List )
obj.anchor = obj.drive .. obj.root if Extension_List == nil or P == nil then
obj._segments = path_blocks return nil
obj.name = path_blocks[#path_blocks]
local suffices = slice(split(obj.name, ".", true), 2)
obj.suffix = suffices[#suffices]
obj.suffices = suffices
setmetatable(obj, self)
self.__index = self
return obj
end end
function PathObj:to_string() local ext_length = 0
local out = self.drive .. self.root for _,item in ipairs(Extension_List) do
local current_ext_length = #item
for i = 1, #self._segments - 1 do if current_ext_length > ext_length then
out = out .. self._segments[i] .. '/' ext_length = current_ext_length
end
end end
out = out .. self._segments[#self._segments] local rev_string = string.reverse(P)
local start_idx = 0
return out local end_idx = 0
local match = nil
while ( true ) do
start_idx, end_idx = string.find(rev_string, ".", start_idx+1, true)
if start_idx == nil or (start_idx-1) > ext_length then
break
end end
function PathObj:data_repr() for _,exts in ipairs(Extension_List) do
print("root = " .. self.root) if exts == string.sub(P, #P - (start_idx -2)) then
local segments = "segments = [" match = exts
for _, seg in ipairs(self.parts) do
segments = segments .. seg .. ","
end end
segments = segments .. "]"
print(segments)
print("name = " .. self.name)
print("suffix = " .. self.suffix)
local suffices = "suffices = ["
for _, seg in ipairs(self.suffices) do
suffices = suffices .. seg .. ","
end end
suffices = suffices .. "]"
print(suffices)
end end
function PathObj:is_absolute() return match
return self.root ~= ''
end end
print(PathObj:new( "home/folkert/test.ads" ):to_string()) function path.Get_Ext( P, Extension_List )
print(PathObj:new( "/home/folkert/test.ads" ):to_string()) if Extension_List == nil then
print(PathObj:new( "//home/folkert/test.ads" ):to_string()) return path.Get_Extension(P)
print(PathObj:new( "///home/folkert/test.ads" ):is_absolute()) else
return path.Get_Extension_From_List(P, Extension_List)
end
end
local x = PathObj:new( "/home/foo/bar/baz.c" ) function path.Walk_Up( P )
print(x:to_string()) if P == "/" then
return nil
end
local rev = string.reverse(P)
local start = 1
if P:sub(-1) == "/" then
start = start + 1
end
return PathObj local slash_first_idx, _ = string.find(rev, "/", start, true)
return string.sub(P, 1, #P - slash_first_idx + 1)
end
function path.Get_File( P )
local rev = string.reverse(P)
local start = 1
local slash_first_idx, _ = string.find(rev, "/", start, true)
return string.sub(P, #P - slash_first_idx + 2)
end
function path.Get_Filename( File )
local dot_first_idx, _ = string.find(File, ".", 1, true)
return string.sub(File, 1, dot_first_idx - 1)
end
function path.Generate_Dir_Walk( Base, Descend_List )
Descend_List = Descend_List or {}
local Descend_Length = #Descend_List
local i = -1
local Base_Dir = Base
function Inner()
if i == Descend_Length then
local Temp_Dir = path.Walk_Up(Base_Dir)
if Temp_Dir ~= nil then
Base_Dir = Temp_Dir
i = -1
end
end
i = i + 1
if i == 0 then
return Base_Dir
elseif i <= Descend_Length then
return Base_Dir .. Descend_List[i] .. "/"
end
end
return Inner
end
return path

View File

@ -1,24 +0,0 @@
package.path = package.path .. ";../lua/SpecSwitcher/path.lua"
local PathObj = require("path")
local tests = {}
function tests.Always_Fail()
assert(false)
end
function tests.Test_Path_Functionality()
local path_1 = "/foo/bar/baz/beef.c"
local path_2 = "//foo/bar/baz/beef.c"
local path_3 = "///foo/bar/baz/beef.c"
local path_4 = "foo/bar/baz/beef.c"
assert( PathObj:new(path_1):to_string() == path_1 )
assert( PathObj:new(path_2):to_string() == path_2 )
assert( PathObj:new(path_3):to_string() == path_1 )
assert( PathObj:new(path_4):to_string() == path_4 )
end
for test_functions in pairs(tests) do
tests[test_functions]()
end