91 lines
3.4 KiB
Lua
91 lines
3.4 KiB
Lua
-- Copyright 2011-12 Paul Kulchenko, ZeroBrane LLC
|
|
|
|
local gslshell
|
|
local win = ide.osname == "Windows"
|
|
|
|
return {
|
|
name = "GSL-shell",
|
|
description = "GSL-shell interpreter",
|
|
api = {"baselib"},
|
|
frun = function(self,wfilename,rundebug)
|
|
gslshell = gslshell or ide.config.path.gslshell -- check if the path is configured
|
|
if not gslshell then
|
|
local sep = win and ';' or ':'
|
|
local default = win and GenerateProgramFilesPath('gsl-shell', sep)..sep or ''
|
|
local path = default
|
|
..(os.getenv('PATH') or '')..sep
|
|
..(GetPathWithSep(self:fworkdir(wfilename)))..sep
|
|
..(os.getenv('HOME') and GetPathWithSep(os.getenv('HOME'))..'bin' or '')
|
|
local paths = {}
|
|
for p in path:gmatch("[^"..sep.."]+") do
|
|
gslshell = gslshell or GetFullPathIfExists(p, win and 'gsl-shell.exe' or 'gsl-shell')
|
|
table.insert(paths, p)
|
|
end
|
|
if not gslshell then
|
|
DisplayOutput("Can't find gsl-shell executable in any of the following folders: "
|
|
..table.concat(paths, ", ").."\n")
|
|
return
|
|
end
|
|
end
|
|
|
|
do
|
|
-- add path to GSL-shell modules and templates/?.lua.in
|
|
local gslpath = GetPathWithSep(gslshell)
|
|
local luapath = gslpath.."gsl-shell/?.lua;"..gslpath.."gsl-shell/templates/?.lua.in"
|
|
local luacpath = gslpath.."gsl-shell/?.dll"
|
|
|
|
-- add GSL-shell modules to the end of LUA_PATH
|
|
local _, path = wx.wxGetEnv("LUA_PATH")
|
|
if path and not path:find(gslpath, 1, true) then
|
|
wx.wxSetEnv("LUA_PATH", path..";"..luapath)
|
|
end
|
|
|
|
-- add GSL-shell modules to the beginning of LUA_CPATH to make luajit
|
|
-- friendly luasocket to load before it loads luasocket shipped with ZBS
|
|
local _, cpath = wx.wxGetEnv("LUA_CPATH")
|
|
if cpath and not cpath:find(gslpath, 1, true) then
|
|
wx.wxSetEnv("LUA_CPATH", luacpath..";"..cpath)
|
|
end
|
|
end
|
|
|
|
local filepath = wfilename:GetFullPath()
|
|
if rundebug then
|
|
DebuggerAttachDefault({runstart = ide.config.debugger.runonstart == true})
|
|
|
|
local tmpfile = wx.wxFileName()
|
|
tmpfile:AssignTempFileName(".")
|
|
filepath = tmpfile:GetFullPath()
|
|
local f = io.open(filepath, "w")
|
|
if not f then
|
|
DisplayOutput("Can't open temporary file '"..filepath.."' for writing\n")
|
|
return
|
|
end
|
|
f:write(rundebug)
|
|
f:close()
|
|
else
|
|
-- if running on Windows and can't open the file, this may mean that
|
|
-- the file path includes unicode characters that need special handling
|
|
local fh = io.open(filepath, "r")
|
|
if fh then fh:close() end
|
|
if ide.osname == 'Windows' and pcall(require, "winapi")
|
|
and wfilename:FileExists() and not fh then
|
|
winapi.set_encoding(winapi.CP_UTF8)
|
|
filepath = winapi.short_path(filepath)
|
|
end
|
|
end
|
|
local params = ide.config.arg.any or ide.config.arg.gslshell
|
|
local code = ([[-e "io.stdout:setvbuf('no')" "%s"]]):format(filepath)
|
|
local cmd = '"'..gslshell..'" '..code..(params and " "..params or "")
|
|
|
|
-- CommandLineRun(cmd,wdir,tooutput,nohide,stringcallback,uid,endcallback)
|
|
return CommandLineRun(cmd,self:fworkdir(wfilename),true,false,nil,nil,
|
|
function() if rundebug then wx.wxRemoveFile(filepath) end end)
|
|
end,
|
|
hasdebugger = true,
|
|
fattachdebug = function(self) DebuggerAttachDefault() end,
|
|
skipcompile = true,
|
|
unhideanywindow = true,
|
|
scratchextloop = false,
|
|
takeparameters = true,
|
|
}
|