blob: 6cad73a079590cf11deb436d6d4f503c29fd5c83 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
import streams
import posix
import display/term
proc c_system(cmd: cstring): cint {.
importc: "system", header: "<stdlib.h>".}
# Run process (without suspending the terminal controller).
proc runProcess*(cmd: string): bool =
let wstatus = c_system(cstring(cmd))
if wstatus == -1:
result = false
else:
result = WIFEXITED(wstatus) and WEXITSTATUS(wstatus) == 0
if not result:
# Hack.
#TODO this is a very bad idea, e.g. say the editor is writing into the
# file, then receives SIGINT, now the file is corrupted but Chawan will
# happily read it as if nothing happened.
# We should find a proper solution for this.
result = WIFSIGNALED(wstatus) and WTERMSIG(wstatus) == SIGINT
# Run process (and suspend the terminal controller).
proc runProcess*(term: Terminal, cmd: string, wait = false): bool =
term.quit()
result = runProcess(cmd)
if wait:
term.anyKey()
term.restart()
# Run process, and capture its output.
proc runProcessCapture*(cmd: string, outs: var string): bool =
let file = popen(cmd, "r")
if file == nil:
return false
let fs = newFileStream(file)
outs = fs.readAll()
let rv = pclose(file)
if rv == -1:
return false
return rv == 0
# Run process, and write an arbitrary string into its standard input.
proc runProcessInto*(cmd, ins: string): bool =
let file = popen(cmd, "w")
if file == nil:
return false
let fs = newFileStream(file)
fs.write(ins)
let rv = pclose(file)
if rv == -1:
return false
return rv == 0
|