home *** CD-ROM | disk | FTP | other *** search
- ########################################################################
- #
- # File: popen.icn
- #
- # Subject: Procedures for pipes
- #
- # Author: Ronald Florence
- #
- # Date: September 28, 1992
- #
- ########################################################################
- #
- # 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
-