aboutsummaryrefslogblamecommitdiff
path: root/src/syslua/lx/shell.lua
blob: 62f210fb5fd0c875564ddab31d8ecc31a9b0c434 (plain) (tree)























































































                                                         
local sys = require 'lx.sys'
local sysdef = require 'lx.sysdef'

local _cwd = 'root:/'

function pathcat(path1, path2)
  assert(path1, "invalid argument")
  if not path2 then
    return path1
  end

  function explode_path(path)
    local _, _, dr, p = string.find(path, '^(%w+):(.*)$')
    if not dr or not p then
      dr, p = nil, path
    end
    local pp = string.split(p, '/')
    if #pp > 1 and pp[#pp] == '' then
      table.remove(pp)
    end
    return dr, pp
  end

  function implode_path(dr, p)
    assert(p[1] == '', 'bad first path component')
    return dr .. ':' .. table.concat(p, '/')
  end

  local dr2, p2 = explode_path(path2)
  if dr2 then
    return implode_path(dr2, p2)
  else
    local dr, p1 = explode_path(path1)
    assert(p1[1] == '', 'bad path1!')
    local p = p1
    if p2[1] == '' then
      p = {}
    end
    for _, v in pairs(p2) do
      if v == '..' then
        table.remove(p)
      elseif v ~= '.' then
        table.insert(p, v)
      end
    end
    return implode_path(dr, p)
  end
end

function cd(path)
  -- TODO path simplification etc
  local newcwd = pathcat(_cwd, path)
  local s = sys.stat(newcwd)
  if not s then
    print("not found: " .. newcwd)
  elseif s.type & sysdef.FT_DIR == 0 then
    print("not a directory: " .. newcwd)
  else
    _cwd = newcwd
    print(_cwd)
  end
end

function cwd()
  return _cwd
end

function ls(path)
  path = pathcat(_cwd, path)

  local fd = sys.open(path, sysdef.FM_READDIR)
  if not fd then
    print("Could not open " .. path)
  else
    local i = 0
    while true do
      x = sys.readdir(fd, i)
      if not x then break end
      if x.type & sysdef.FT_DIR ~= 0 then
        x.name = x.name .. '/'
      end
      print(x.type, x.access, x.size, x.name)
      i = i + 1
    end
    sys.close(fd)
  end
end