From f60e809b87c6d9b0ea87ceeb54507d486f2934eb Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Sat, 26 Jul 2014 12:46:53 +0200 Subject: sync with Context as of 2014-07-26 --- lualibs-dir.lua | 9 +++++++-- lualibs-file.lua | 17 +++++++++++++++++ lualibs-table.lua | 25 ++++++++++++++++++------- 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/lualibs-dir.lua b/lualibs-dir.lua index 660529b..bcf28d0 100644 --- a/lualibs-dir.lua +++ b/lualibs-dir.lua @@ -36,9 +36,14 @@ if onwindows then -- lfs.isdir does not like trailing / -- lfs.dir accepts trailing / + local tricky = S("/\\") * P(-1) + isdir = function(name) - name = gsub(name,"([/\\]+)$","/.") - return attributes(name,"mode") == "directory" + if lpegmatch(tricky,name) then + return attributes(name,"mode") == "directory" + else + return attributes(name.."/.","mode") == "directory" + end end isfile = function(name) diff --git a/lualibs-file.lua b/lualibs-file.lua index ebb2b39..c05372a 100644 --- a/lualibs-file.lua +++ b/lualibs-file.lua @@ -495,6 +495,23 @@ function file.collapsepath(str,anchor) -- anchor: false|nil, true, "." end end +-- better this way: + +local tricky = S("/\\") * P(-1) +local attributes = lfs.attributes + +function lfs.isdir(name) + if lpegmatch(tricky,name) then + return attributes(name,"mode") == "directory" + else + return attributes(name.."/.","mode") == "directory" + end +end + +function lfs.isfile(name) + return attributes(name,"mode") == "file" +end + -- local function test(str,...) -- print(string.format("%-20s %-15s %-30s %-20s",str,file.collapsepath(str),file.collapsepath(str,true),file.collapsepath(str,"."))) -- end diff --git a/lualibs-table.lua b/lualibs-table.lua index ca067fb..e642106 100644 --- a/lualibs-table.lua +++ b/lualibs-table.lua @@ -922,16 +922,27 @@ end table.identical = identical table.are_equal = are_equal --- maybe also make a combined one - -function table.compact(t) -- remove empty tables, assumes subtables - if t then - for k, v in next, t do - if not next(v) then -- no type checking - t[k] = nil +local function sparse(old,nest,keeptables) + local new = { } + for k, v in next, old do + if not (v == "" or v == false) then + if nest and type(v) == "table" then + v = sparse(v,nest) + if keeptables or next(v) then + new[k] = v + end + else + new[k] = v end end end + return new +end + +table.sparse = sparse + +function table.compact(t) + return sparse(t,true,true) end function table.contains(t, v) -- cgit v1.2.3