HEX
Server: nginx/1.22.1
System: Linux iZuf67d4hh2ssx30nkok6dZ 3.10.0-1160.119.1.el7.x86_64 #1 SMP Tue Jun 4 14:43:51 UTC 2024 x86_64
User: www (1000)
PHP: 7.4.33
Disabled: passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Upload Files
File: //bin/abs2rel
#!/usr/bin/lua

--[[
abs2rel for Lua

split and split_path taken from "Split a string with a pattern, Take Two"
  http://lua-users.org/wiki/SplitJoin
--]]

function split(str, pat)
   local t = {}  -- NOTE: use {n = 0} in Lua-5.0
   local fpat = "(.-)" .. pat
   local last_end = 1
   local s, e, cap = str:find(fpat, 1)
   while s do
      if s ~= 1 or cap ~= "" then
	 table.insert(t,cap)
      end
      last_end = e+1
      s, e, cap = str:find(fpat, last_end)
   end
   if last_end <= #str then
      cap = str:sub(last_end)
      table.insert(t, cap)
   end
   return t
end

function split_path(str)
   return split(str,'[\\/]+')
end

-- parts = split_path("/usr/local/bin")
--> {'usr','local','bin'}

function join(words, sep)
   local s = ""
   for i,v in ipairs(words) do
      s = s .. sep .. v
   end
   return string.sub (s, string.len(sep)+1)
end

function abs2rel(path, base)
   if path == base then return "." end
   local pathdirs = split_path(path)
   local basedirs = split_path(base)
   local i = 1
   local rem_i = math.min(#pathdirs, #basedirs)

   -- remove common parts of both paths
   while (rem_i > 0) and (pathdirs[i] == basedirs[i]) do
      rem_i = rem_i - 1
      table.remove(pathdirs, 1)
      table.remove(basedirs, 1)
   end

   -- now for each remaining basedirs, replace them with ..
   if #basedirs > 0 then
      for i, v in ipairs(basedirs) do
	 basedirs[i] = ".."
      end
   end
   for i, v in ipairs(pathdirs) do
      basedirs[#basedirs+1] = v
   end
   return join(basedirs, "/")
end

if #arg ~= 2 then
   io.stderr:write("usage: " .. arg[0] .. " <PATH> <BASE>\n")
   os.exit(1)
end

print(abs2rel(arg[1], arg[2]))