summaryrefslogtreecommitdiff
path: root/ipl/procs/popen.icn
diff options
context:
space:
mode:
Diffstat (limited to 'ipl/procs/popen.icn')
-rw-r--r--ipl/procs/popen.icn86
1 files changed, 86 insertions, 0 deletions
diff --git a/ipl/procs/popen.icn b/ipl/procs/popen.icn
new file mode 100644
index 0000000..4ceb0b2
--- /dev/null
+++ b/ipl/procs/popen.icn
@@ -0,0 +1,86 @@
+############################################################################
+#
+# File: popen.icn
+#
+# Subject: Procedures for pipes
+#
+# Author: Ronald Florence
+#
+# Date: September 28, 1992
+#
+############################################################################
+#
+# This file is in the public domain.
+#
+############################################################################
+#
+# Version: 1.0
+#
+############################################################################
+#
+# Contents:
+#
+# popen(command, mode)
+# mode == "w" writes to a pipe
+# mode == "r" reads from a pipe
+#
+# pclose(pipe)
+#
+# On systems without real pipes (ms-dos), popen and pclose imitate
+# pipes; pclose must be called after popen. The code should run
+# faster on ms-dos if dir in tempfile() points to a directory on a
+# virtual disk.
+#
+# On systems with real pipes, popen & pclose open and close a pipe.
+#
+############################################################################
+
+global PIPE_cmd, PIPE_fname
+
+procedure popen(cmd, mode)
+ local tfn, p
+
+ initial ("pipes" == &features) | {
+ PIPE_cmd := table()
+ PIPE_fname := table()
+ }
+ (type(PIPE_fname) ~== "table") & return open(cmd, mode || "p")
+ tfn := tempfile("pipe.")
+ upto('r', mode) & system(cmd || " > " || tfn)
+ p := open(tfn, mode)
+ PIPE_fname[p] := tfn
+ upto('w', mode) & PIPE_cmd[p] := cmd
+ return p
+end
+
+
+procedure pclose(pipe)
+ local status
+
+ (type(PIPE_fname) ~== "table") & return close(pipe)
+ if \PIPE_cmd[pipe] then {
+ close(pipe)
+ PIPE_cmd[pipe] ||:= " < " || PIPE_fname[pipe]
+ status := system(PIPE_cmd[pipe])
+ }
+ else status := close(pipe)
+ remove(PIPE_fname[pipe])
+ PIPE_cmd[pipe] := PIPE_fname[pipe] := &null
+ return status
+end
+
+ # Richard Goerwitz's ever-useful generator.
+
+procedure tempfile(template)
+ local temp_name
+ static dir
+
+ initial {
+ if "UNIX" == &features then dir := "/tmp/"
+ else dir := ""
+ }
+ every temp_name := dir || template || right(1 to 999,3,"0") do {
+ close(open(temp_name)) & next
+ suspend \temp_name
+ }
+end