Advertisement
Tatantyler

File API w/ Seek

Nov 8th, 2012
546
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.49 KB | None | 0 0
  1. local binaryFile = {
  2.     buffer = {},
  3.     file = fileName,
  4.     position = 1,
  5.     write = function(self, ...)
  6.         for i,v in ipairs(arg) do
  7.             table.insert(self.buffer, self.position, v)
  8.             self:seek("cur", 1)
  9.         end
  10.     end,
  11.     read = function(self, bytes)
  12.         bytes = bytes or 1
  13.         local data = {unpack(self.buffer, self.position, self.position+bytes)}
  14.         self:seek("cur", bytes+1)
  15.         return data
  16.     end,
  17.     seek = function(self, whence, offset)
  18.         if whence == "set" then
  19.             whence = 1
  20.         elseif whence == "cur" then
  21.             whence = self.position
  22.         elseif whence == "end" then
  23.             whence = #self.buffer+1
  24.         else
  25.             whence = self.position
  26.         end
  27.         if not offset then
  28.             offset = 0
  29.         end
  30.        
  31.         if whence + offset > #self.buffer+1 then
  32.             return false, "whence + offset > length of file"
  33.         elseif whence+offset < 0 then
  34.             return false, "whence + offset < 0"
  35.         else
  36.             self.position = whence+offset
  37.             return self.position
  38.         end
  39.     end,
  40.     flush = function(self)
  41.         local handle = fs.open(self.file, "wb")
  42.         for i,v in ipairs(self.buffer) do
  43.             handle.write(v)
  44.         end
  45.         handle.close()
  46.     end,
  47.     update = function(self)
  48.         if fs.exists(self.file) then
  49.             local handle = fs.open(self.file, "rb")
  50.             self.buffer = {}
  51.             while true do
  52.                 local byte = handle.read()
  53.                 if byte then
  54.                     table.insert(self.buffer, byte)
  55.                 else
  56.                     return
  57.                 end
  58.             end
  59.             handle.close()
  60.             return true
  61.         end
  62.         return false
  63.     end,
  64.     readAll = function(self)
  65.         self:seek("end")
  66.         return self.buffer
  67.     end,
  68.     clear = function(self)
  69.         self.buffer = {}
  70.     end,
  71.     bytes = function(self)
  72.         local i = 1
  73.         return function()
  74.             if i > #self.buffer then
  75.                 return
  76.             end
  77.             data = self.buffer[i]
  78.             i = i+1
  79.             return data
  80.         end
  81.     end,
  82.     new = function(self, file)
  83.         local object = {["file"] = file}
  84.         setmetatable(object, self)
  85.         self.__index = self
  86.         object:update()
  87.         return object
  88.     end
  89. }
  90.  
  91. local textFile = {
  92.     position = 1,
  93.     bufmode = 1,
  94.     file = fileName,
  95.     internalBuffer = "",
  96.     writeToBuffer = function(self, data)
  97.         local beforePosition = string.sub(self.internalBuffer, 1, self.position-1)
  98.         local afterPosition = string.sub(self.internalBuffer, self.position)
  99.         self.internalBuffer = beforePosition..data..afterPosition
  100.     end,
  101.     update = function(self)
  102.         if fs.exists(self.file) then
  103.             local handle = fs.open(self.file, "r")
  104.             self.internalBuffer = handle.readAll()
  105.             handle.close()
  106.             return true
  107.         end
  108.         return false
  109.     end,
  110.     seek = function(self, whence, offset)
  111.         if whence == "set" then
  112.             whence = 1
  113.         elseif whence == "cur" then
  114.             whence = self.position
  115.         elseif whence == "end" then
  116.             whence = #self.internalBuffer+1
  117.         else
  118.             whence = self.position
  119.         end
  120.         if not offset then
  121.             offset = 0
  122.         end
  123.        
  124.         if whence + offset > #self.internalBuffer+1 then
  125.             return false, "whence + offset > length of file"
  126.         elseif whence+offset < 0 then
  127.             return false, "whence + offset < 0"
  128.         else
  129.             self.position = whence+offset
  130.             return self.position
  131.         end
  132.     end,
  133.     flush = function(self)
  134.         local internalHandle = fs.open(self.file, "w")
  135.         internalHandle.write(self.internalBuffer)
  136.         internalHandle.close()
  137.     end,
  138.     write = function(self, ...)
  139.         for i,v in ipairs(arg) do
  140.             self:writeToBuffer(v)
  141.             if self.seekAfterWrite then
  142.                 self:seek("cur", #v+1)
  143.             end
  144.         end
  145.     end,
  146.     clear = function(self)
  147.         self.internalBuffer = ""
  148.     end,
  149.     writeLine = function(self, ...)
  150.         for i,v in ipairs(arg) do
  151.             self:writeToBuffer(v.."\n")
  152.             self:seek("cur", #v+2)
  153.         end
  154.     end,
  155.     readLine = function(self)
  156.         local nextNewLine = string.find(self.internalBuffer, "\n", self.position)
  157.         if nextNewLine then
  158.             local line = string.sub(self.internalBuffer, self.position, nextNewLine)
  159.             self.position = nextNewLine+1
  160.             return line
  161.         end
  162.     end,
  163.     readAll = function(self)
  164.         self:seek("end")
  165.         return string.sub(self.internalBuffer, self.position)
  166.     end,
  167.     read = function(self, chars)
  168.         chars = chars or 1
  169.         local data = string.sub(self.internalBuffer, self.position, self.position+chars)
  170.         self:seek("cur", chars+1)
  171.         return data
  172.     end,
  173.     lines = function(self)
  174.         local oldPos = self:seek()
  175.         return function()
  176.             local line = self:readLine()
  177.             if line == nil then
  178.                 self:seek("set", oldPos)
  179.             end
  180.             return line
  181.         end
  182.     end,
  183.     new = function(self, file)
  184.         local object = {["file"] = file}
  185.         setmetatable(object, self)
  186.         self.__index = self
  187.         object:update()
  188.         return object
  189.     end
  190. }
  191.  
  192. function openBinary(fileName)
  193.     return binaryFile:new(fileName)
  194. end
  195.  
  196. function open(fileName)
  197.     return textFile:new(fileName)
  198. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement