117 lines
3.7 KiB
Elixir
117 lines
3.7 KiB
Elixir
-- gneui.ex 1.0
|
|
--
|
|
-- 2013 2013-03-21
|
|
-- Kenneth Rhodes <wolfmanjacques@gmail.com>
|
|
--
|
|
-- This file wraps the Euphoria interpreter
|
|
-- together with a routine which extracts
|
|
-- ex.err file data and passes the name,
|
|
-- path, line and column to the Geany editor
|
|
--
|
|
-- usage: Geany run_cmd = eui gneui.ex ./%f
|
|
-- Set run source code command to this as well,
|
|
-- Execute your code from Geany; upon error,
|
|
-- Geany will position the cursor at the line
|
|
-- and column of the error.
|
|
|
|
--* Heavily modified by Irv Mullins
|
|
--* to try to handle signal 11 errors from GTK
|
|
|
|
include std/io.e
|
|
include std/convert.e
|
|
include std/error.e
|
|
include std/filesys.e
|
|
include std/console.e
|
|
include std/sequence.e
|
|
|
|
object file_name, command, err
|
|
integer exit_code = 0
|
|
|
|
sequence cl = command_line()
|
|
system("clear",0)
|
|
|
|
if length(cl) >= 3 then
|
|
|
|
file_name = cl[3]
|
|
command = sprintf( "eui -D DEBUG \"%s\"", {file_name} )
|
|
printf(1,
|
|
`-----------------------------------------------------------------------
|
|
/// Running %s with gneui
|
|
------------------------------------------------------------------------
|
|
`,{file_name})
|
|
|
|
-- look for old ex.err in current directory;
|
|
err = canonical_path(file_name)
|
|
err = pathname(err) & "/" & "ex.err"
|
|
|
|
if file_exists(err) then
|
|
delete_file(err) -- remove old ex.err if it exists;
|
|
end if
|
|
|
|
exit_code = system_exec ( command, 0 ) -- call eui with debugging;
|
|
if exit_code != 0 then -- on error
|
|
ParseErrorFile()
|
|
end if
|
|
|
|
end if
|
|
|
|
--------------------------
|
|
procedure ParseErrorFile()
|
|
--------------------------
|
|
object file_lines
|
|
object temp_line
|
|
object err_line
|
|
integer err_col = 0, i = 0
|
|
|
|
if not file_exists("ex.err") then
|
|
abort(exit_code) -- can't fine ex.err!
|
|
end if
|
|
|
|
file_lines = read_lines(err)
|
|
if atom(file_lines) then -- ex.err was empty
|
|
crash("Cannot find ex.err!\n")
|
|
end if
|
|
|
|
object x = split(file_lines[1])
|
|
|
|
for n = 1 to length(file_lines) do
|
|
if match("^^^ call-back from external source",file_lines[n]) = 1 then
|
|
file_lines = file_lines[1..n-1] -- get rid of non-useful part of ex.err listing;
|
|
exit
|
|
end if
|
|
end for
|
|
|
|
-- trap & process GTK signal 11 errors;
|
|
for n = length(file_lines) to 2 by -1 do
|
|
-- start at end of ex.err, to find last (topmost) error line #;
|
|
if match("... called from /", file_lines[n]) then
|
|
i = find(':', file_lines[n])
|
|
file_name = file_lines[n][17..i-1]
|
|
err_line = file_lines[n][i+1..$]
|
|
i = find(' ',err_line)
|
|
err_line = err_line[1..i-1]
|
|
err_line = to_number(err_line)
|
|
-- display the file and line #, then call geany to edit it;
|
|
printf(1,"\nFile:%s - LINE:%d \n",{file_name,err_line})
|
|
system( sprintf("geany \"%s:%d\"", {file_name,err_line} ))
|
|
abort(exit_code)
|
|
end if
|
|
end for
|
|
|
|
-- trap & process euphoria error report;
|
|
for n = 1 to length(file_lines) do
|
|
-- start at top of ex.err, to find first syntax error;
|
|
if find('^', file_lines[n]) then
|
|
i = find(':',file_lines[1])
|
|
err_col = match("^",file_lines[n])-1
|
|
file_name = file_lines[1][1..i-1]
|
|
err_line = to_number(file_lines[1][i+1..$])
|
|
-- display the file and line #, then call geany to edit it;
|
|
printf(1,"\nFILE:%s - LINE:%d COL:%d\n",{file_name,err_line,err_col})
|
|
system( sprintf("geany \"%s:%d:%d\" & ", {file_name, err_line, err_col} ))
|
|
abort(exit_code)
|
|
end if
|
|
end for
|
|
|
|
end procedure
|