diff options
| author | Philipp Gesang <megas.kapaneus@gmail.com> | 2012-10-19 18:48:53 +0200 | 
|---|---|---|
| committer | Philipp Gesang <megas.kapaneus@gmail.com> | 2012-10-19 18:48:53 +0200 | 
| commit | 8dff98a320873888fd263cb7db46a04bff168d54 (patch) | |
| tree | 2ddce53de7bd64e0c9d39ee97fd5a3f00d9c1ee2 | |
| parent | e9578dd0f5221aa22d7fc240c3258b05fc213b94 (diff) | |
| download | lualibs-8dff98a320873888fd263cb7db46a04bff168d54.tar.gz | |
update l-io
| -rw-r--r-- | lualibs-io.lua | 105 | 
1 files changed, 77 insertions, 28 deletions
| diff --git a/lualibs-io.lua b/lualibs-io.lua index 66e2793..a9269ab 100644 --- a/lualibs-io.lua +++ b/lualibs-io.lua @@ -6,7 +6,10 @@ if not modules then modules = { } end modules ['l-io'] = {      license   = "see context related readme files"  } -local byte, find, gsub = string.byte, string.find, string.gsub +local io = io +local byte, find, gsub, format = string.byte, string.find, string.gsub, string.format +local concat = table.concat +local type = type  if string.find(os.getenv("PATH"),";") then      io.fileseparator, io.pathseparator = "\\", ";" @@ -14,16 +17,14 @@ else      io.fileseparator, io.pathseparator = "/" , ":"  end -function io.loaddata(filename,textmode) +function io.loaddata(filename,textmode) -- return nil if empty      local f = io.open(filename,(textmode and 'r') or 'rb')      if f then -    --  collectgarbage("step") -- sometimes makes a big difference in mem consumption          local data = f:read('*all') -    --  garbagecollector.check(data)          f:close() -        return data -    else -        return nil +        if #data > 0 then +            return data +        end      end  end @@ -31,19 +32,59 @@ function io.savedata(filename,data,joiner)      local f = io.open(filename,"wb")      if f then          if type(data) == "table" then -            f:write(table.join(data,joiner or "")) +            f:write(concat(data,joiner or ""))          elseif type(data) == "function" then              data(f)          else              f:write(data or "")          end          f:close() +        io.flush()          return true      else          return false      end  end +function io.loadlines(filename,n) -- return nil if empty +    local f = io.open(filename,'r') +    if f then +        if n then +            local lines = { } +            for i=1,n do +                local line = f:read("*lines") +                if line then +                    lines[#lines+1] = line +                else +                    break +                end +            end +            f:close() +            lines = concat(lines,"\n") +            if #lines > 0 then +                return lines +            end +        else +            local line = f:read("*line") or "" +            assert(f:close()) +            if #line > 0 then +                return line +            end +        end +    end +end + +function io.loadchunk(filename,n) +    local f = io.open(filename,'rb') +    if f then +        local data = f:read(n or 1024) +        f:close() +        if #data > 0 then +            return data +        end +    end +end +  function io.exists(filename)      local f = io.open(filename)      if f == nil then @@ -66,12 +107,19 @@ function io.size(filename)  end  function io.noflines(f) -    local n = 0 -    for _ in f:lines() do -        n = n + 1 +    if type(f) == "string" then +        local f = io.open(filename) +        local n = f and io.noflines(f) or 0 +        assert(f:close()) +        return n +    else +        local n = 0 +        for _ in f:lines() do +            n = n + 1 +        end +        f:seek('set',0) +        return n      end -    f:seek('set',0) -    return n  end  local nextchar = { @@ -97,8 +145,6 @@ local nextchar = {  function io.characters(f,n)      if f then          return nextchar[n or 1], f -    else -        return nil, nil      end  end @@ -107,40 +153,42 @@ local nextbyte = {          local a, b, c, d = f:read(1,1,1,1)          if d then              return byte(a), byte(b), byte(c), byte(d) -        else -            return nil, nil, nil, nil +        end +    end, +    [3] = function(f) +        local a, b, c = f:read(1,1,1) +        if b then +            return byte(a), byte(b), byte(c)          end      end,      [2] = function(f)          local a, b = f:read(1,1)          if b then              return byte(a), byte(b) -        else -            return nil, nil          end      end,      [1] = function (f)          local a = f:read(1)          if a then              return byte(a) -        else -            return nil          end      end,      [-2] = function (f)          local a, b = f:read(1,1)          if b then              return byte(b), byte(a) -        else -            return nil, nil +        end +    end, +    [-3] = function(f) +        local a, b, c = f:read(1,1,1) +        if b then +            return byte(c), byte(b), byte(a)          end      end,      [-4] = function(f)          local a, b, c, d = f:read(1,1,1,1)          if d then              return byte(d), byte(c), byte(b), byte(a) -        else -            return nil, nil, nil, nil          end      end  } @@ -157,12 +205,13 @@ function io.ask(question,default,options)      while true do          io.write(question)          if options then -            io.write(string.format(" [%s]",table.concat(options,"|"))) +            io.write(format(" [%s]",concat(options,"|")))          end          if default then -            io.write(string.format(" [%s]",default)) +            io.write(format(" [%s]",default))          end -        io.write(string.format(" ")) +        io.write(format(" ")) +        io.flush()          local answer = io.read()          answer = gsub(answer,"^%s*(.*)%s*$","%1")          if answer == "" and default then | 
