summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/luv/examples/repl.lua
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/luv/examples/repl.lua')
-rw-r--r--3rdparty/luv/examples/repl.lua89
1 files changed, 89 insertions, 0 deletions
diff --git a/3rdparty/luv/examples/repl.lua b/3rdparty/luv/examples/repl.lua
new file mode 100644
index 00000000000..92be0f17d87
--- /dev/null
+++ b/3rdparty/luv/examples/repl.lua
@@ -0,0 +1,89 @@
+local uv = require('luv')
+local utils = require('lib/utils')
+
+if uv.guess_handle(0) ~= "tty" or
+ uv.guess_handle(1) ~= "tty" then
+ error "stdio must be a tty"
+end
+local stdin = uv.new_tty(0, true)
+local stdout = require('lib/utils').stdout
+
+local debug = require('debug')
+local c = utils.color
+
+local function gatherResults(success, ...)
+ local n = select('#', ...)
+ return success, { n = n, ... }
+end
+
+local function printResults(results)
+ for i = 1, results.n do
+ results[i] = utils.dump(results[i])
+ end
+ print(table.concat(results, '\t'))
+end
+
+local buffer = ''
+
+local function evaluateLine(line)
+ if line == "<3\n" then
+ print("I " .. c("Bred") .. "♥" .. c() .. " you too!")
+ return '>'
+ end
+ local chunk = buffer .. line
+ local f, err = loadstring('return ' .. chunk, 'REPL') -- first we prefix return
+
+ if not f then
+ f, err = loadstring(chunk, 'REPL') -- try again without return
+ end
+
+ if f then
+ buffer = ''
+ local success, results = gatherResults(xpcall(f, debug.traceback))
+
+ if success then
+ -- successful call
+ if results.n > 0 then
+ printResults(results)
+ end
+ else
+ -- error
+ print(results[1])
+ end
+ else
+
+ if err:match "'<eof>'$" then
+ -- Lua expects some more input; stow it away for next time
+ buffer = chunk .. '\n'
+ return '>>'
+ else
+ print(err)
+ buffer = ''
+ end
+ end
+
+ return '>'
+end
+
+local function displayPrompt(prompt)
+ uv.write(stdout, prompt .. ' ')
+end
+
+local function onread(err, line)
+ if err then error(err) end
+ if line then
+ local prompt = evaluateLine(line)
+ displayPrompt(prompt)
+ else
+ uv.close(stdin)
+ end
+end
+
+coroutine.wrap(function()
+ displayPrompt '>'
+ uv.read_start(stdin, onread)
+end)()
+
+uv.run()
+
+print("")