3 local spawn = require('spawn.posix')
4 local unix = require('unix')
5 local lpeg = require('lpeg')
7 local V, R, P, S, C, Ct, Cg, Cmt, Cb =
8 lpeg.V, lpeg.R, lpeg.P, lpeg.S, lpeg.C, lpeg.Ct, lpeg.Cg, lpeg.Cmt,
13 cnc = (P":" * (R"09")^1 * P": "),
14 fn = (P(1) - (P" " + V"cnc"))^1,
15 full = V"fn" * V"cnc",
17 fatal_error_occurred = (P(1) - (P" ==> Fatal error"))^1 * P" ==> Fatal error"
19 exclam_start = P"! " * (1 - P" ")
22 runaway = P"Runaway argument?" * (-1)
26 idf = P("I didn't find a database entry") + 1 * V"idf",
27 full = P("WARN") * V"idf",
30 bibtex_subsystem_error = P{
32 full = P("ERROR - BibTeX subsystem") * 1^0,
35 function should_print(s, l)
38 -- ... blah blah blah ...
39 -- ! ==> Fatal error occurred, no output...
40 if s.wait_for_exclam_finish then
41 if exclam_finish:match(l) then
42 s.wait_for_exclam_finish = false
49 if exclam_start:match(l) then
50 s.wait_for_exclam_finish = true
55 -- file:12: Undefined control sequence
56 -- ... blah blah blah ...
57 -- file:12: ==> Fatal error occurred, no output...
59 if s.wait_for_fle_fatal_error_message then
60 if fatal_error_occurred:match(l) then
61 s.wait_for_fle_fatal_error_message = false
68 if file_line_error:match(l) then
69 s.wait_for_fle_fatal_error_message = true
76 if s.show_next > 0 then
77 s.show_next = s.show_next - 1
81 if runaway:match(l) then
86 if biber_error:match(l) then
90 if bibtex_subsystem_error:match(l) then
97 local file_actions = assert(spawn.new_file_actions())
98 local attr = assert(spawn.new_attr())
99 local child_stdin, child_stdout, read, write
100 child_stdin, write = assert(unix.fpipe("e"))
101 read, child_stdout = assert(unix.fpipe("e"))
102 assert(file_actions:adddup2(unix.fileno(child_stdin), 0))
103 assert(file_actions:adddup2(unix.fileno(child_stdout), 1))
104 assert(file_actions:adddup2(1, 2))
106 local pid = assert(spawn.spawnp(arg[1], file_actions, attr,
112 wait_for_exclam_finish = false,
113 wait_for_fle_fatal_error_message = false,
116 line = read:read('*line')
117 if not line then break end
118 line = should_print(state, line)
120 io.stderr:write(line .. "\n")
125 _, why, status = unix.waitpid(pid)