about summary refs log tree commit diff stats
path: root/source_file.lua
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2022-09-03 14:13:22 -0700
committerKartik K. Agaram <vc@akkartik.com>2022-09-03 14:13:22 -0700
commite1c5a42f311fdafd88506726bbe480f3fcc2d1a3 (patch)
tree6628729cc55947d0bd5d306704e88b57680c3514 /source_file.lua
parent9c72ff1bb4fc1ba08acfb0324079da6fe49f3a4a (diff)
downloadlines.love-e1c5a42f311fdafd88506726bbe480f3fcc2d1a3.tar.gz
editing source code from within the app
integrated from pong.love via text.love:
  https://merveilles.town/@akkartik/108933336531898243
Diffstat (limited to 'source_file.lua')
-rw-r--r--source_file.lua89
1 files changed, 89 insertions, 0 deletions
diff --git a/source_file.lua b/source_file.lua
new file mode 100644
index 0000000..978e949
--- /dev/null
+++ b/source_file.lua
@@ -0,0 +1,89 @@
+-- primitives for saving to file and loading from file
+
+Fold = '\x1e'  -- ASCII RS (record separator)
+
+function file_exists(filename)
+  local infile = App.open_for_reading(filename)
+  if infile then
+    infile:close()
+    return true
+  else
+    return false
+  end
+end
+
+function load_from_disk(State)
+  local infile = App.open_for_reading(State.filename)
+  State.lines = load_from_file(infile)
+  if infile then infile:close() end
+end
+
+function load_from_file(infile)
+  local result = {}
+  if infile then
+    local infile_next_line = infile:lines()  -- works with both Lua files and LÖVE Files (https://www.love2d.org/wiki/File)
+    while true do
+      local line = infile_next_line()
+      if line == nil then break end
+      local line_info = {}
+      if line:find(Fold) then
+        _, _, line_info.data, line_info.dataB = line:find('([^'..Fold..']*)'..Fold..'([^'..Fold..']*)')
+      else
+        line_info.data = line
+      end
+      table.insert(result, line_info)
+    end
+  end
+  if #result == 0 then
+    table.insert(result, {data=''})
+  end
+  return result
+end
+
+function save_to_disk(State)
+  local outfile = App.open_for_writing(State.filename)
+  if outfile == nil then
+    error('failed to write to "'..State.filename..'"')
+  end
+  for _,line in ipairs(State.lines) do
+    outfile:write(line.data)
+    if line.dataB and #line.dataB > 0 then
+      outfile:write(Fold)
+      outfile:write(line.dataB)
+    end
+    outfile:write('\n')
+  end
+  outfile:close()
+end
+
+function file_exists(filename)
+  local infile = App.open_for_reading(filename)
+  if infile then
+    infile:close()
+    return true
+  else
+    return false
+  end
+end
+
+-- for tests
+function load_array(a)
+  local result = {}
+  local next_line = ipairs(a)
+  local i,line,drawing = 0, ''
+  while true do
+    i,line = next_line(a, i)
+    if i == nil then break end
+    local line_info = {}
+    if line:find(Fold) then
+      _, _, line_info.data, line_info.dataB = line:find('([^'..Fold..']*)'..Fold..'([^'..Fold..']*)')
+    else
+      line_info.data = line
+    end
+    table.insert(result, line_info)
+  end
+  if #result == 0 then
+    table.insert(result, {data=''})
+  end
+  return result
+end