aboutsummaryrefslogtreecommitdiff
path: root/sys/clio/zfiocl.x
diff options
context:
space:
mode:
authorJoe Hunkeler <jhunkeler@gmail.com>2015-08-11 16:51:37 -0400
committerJoe Hunkeler <jhunkeler@gmail.com>2015-08-11 16:51:37 -0400
commit40e5a5811c6ffce9b0974e93cdd927cbcf60c157 (patch)
tree4464880c571602d54f6ae114729bf62a89518057 /sys/clio/zfiocl.x
downloadiraf-osx-40e5a5811c6ffce9b0974e93cdd927cbcf60c157.tar.gz
Repatch (from linux) of OSX IRAF
Diffstat (limited to 'sys/clio/zfiocl.x')
-rw-r--r--sys/clio/zfiocl.x317
1 files changed, 317 insertions, 0 deletions
diff --git a/sys/clio/zfiocl.x b/sys/clio/zfiocl.x
new file mode 100644
index 00000000..dde60fc9
--- /dev/null
+++ b/sys/clio/zfiocl.x
@@ -0,0 +1,317 @@
+# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
+
+include <knet.h>
+include <mach.h>
+include <config.h>
+include <fset.h>
+include <fio.h>
+include <ctype.h>
+include <clio.h>
+
+define SZ_NUMSTR 8
+
+.help zfiocl
+.nf __________________________________________________________________________
+ZFIOCL -- FIO z-routines (machine independent) for pseudofile i/o. The STDIN,
+STDOUT, STDERR, and STDGRAPH streams are implemented as "pseudofiles" when a
+process is run as a connected subprocess communicating with the parent process
+via the IPC facilities. In such a configuration the standard i/o streams
+(opened by the system [clopen] at process startup) are as follows:
+
+ fd name description
+
+ 1 CLIN IPC input from the parent [low level]
+ 2 CLOUT IPC output to the parent [low level]
+ 3 STDIN standard input
+ 4 STDOUT standard output
+ 5 STDERR standard error output
+ 6 STDGRAPH standard graphics output
+ 7 STDIMAGE standard greyscal output
+ 8 STDPLOT stdgraph plotter output
+ 9 PSIOCTRL pseudofile i/o control
+
+The CLIN and CLOUT streams are the FIO equivalents of the IPC channels, i.e.,
+they are connected to physical host i/o channels. The standard i/o streams
+are multiplexed over the IPC channels by a packet passing protocol to the
+parent process, which redirects each stream to an FIO file (which may in turn
+be a pseudofile or a regular file).
+
+During execution of the child the parent has its command input switched to
+the CLOUT stream of the child, and the child commands the parent. Commands
+are sent over the IPC channels as an SPP text stream, i.e., unpacked ASCII
+lines delimited by the newline character. Pseudofile data is sent as a
+binary block preceded by a command to the parent to read so many chars from
+the channel and pass it on to the indicated actual file. Typical output to
+CLOUT might be as follows:
+
+ param1 =
+ param2 =
+ xmit(4,34)
+ [34 chars of data]
+
+This example consists of three independent commands to the parent. The first
+two are parameter requests and each is followed by a read from CLIN to get
+the parameter value (which is returned in ASCII and is limited to a single
+line). Syncronization occurs on the read. The binary data block in the
+third command (XMIT) may contain arbitrary binary data, i.e., pseudofile
+i/o is not limited to text. In the example shown the 34 chars of data will
+be copied to the file associated by the parent with the STDOUT stream of
+the child. The association of pseudofile codes at the IPC level with FIO
+file descriptor codes is simple: the pseudofile codes are the same as the
+fd codes.
+
+Although it is not relevant to a discussion of the pseudofile drivers, perhaps
+we should mention what happens to these streams when a process is run stand
+alone, i.e., no IPC channels. When a process is run stand-alone (prtype ==
+PR_HOST) CLIN, CLOUT, and the pseudofiles are connected to standard i/o
+channels of the process as follows:
+
+ CLIN,STDIN -> process_stdin
+ CLOUT,STDOUT -> process_stdout
+ STDERR -> process_stderr
+ STDGRAPH,etc. -> null file
+
+The standard i/o streams are normally limited to text data in stand alone
+mode, since the process channels are normally connected to a terminal. Any
+standard i/o stream may be redirected on the IRAF Main command line to
+either a text or binary file, regardless of the process type (connected,
+detached, or host).
+
+This file contains the FIO device drivers for each pseudofile. The device
+codes are SI, SO, SE, and SG. ZARDBF, ZAWRBF, ZAWTBF, and ZSTTBF entry
+points are supplied for each device.
+.endhelp _____________________________________________________________________
+
+
+# ZCLSPS -- Dummy close procedure for all pseudofile streams.
+
+procedure zclsps (chan, status)
+
+int chan
+int status
+
+begin
+ status = ERR
+end
+
+
+# ZARDPS -- "Asynchronous" read primitive for a pseudofile. The read is
+# initiated by sending the following command to the parent:
+#
+# xfer(ps,maxchars)\n
+#
+# where "ps" is the pseudofile code (3=STDIN, etc.) and "maxchars" is the
+# maximum number of chars to be returned. The parent responds with the actual
+# number of chars to be sent, followed by newline, followed by the block of
+# data, i.e.:
+#
+# CLOUT CLIN
+# xfer(3,512)\n
+# 40\n
+# [40 chars of data]
+#
+# The parent responds by writing to the child's CLIN.
+#
+# NOTE1 -- Since this is a device driver (effectively a kernel procedure despite
+# the machine independence) only low level procedures may be used, else a
+# recursive call may result.
+# NOTE2 -- There are some subtleties inherent in all this which are not obvious
+# at first glance. Since CLIN and STDIN both read from the same IPC, some care
+# is required to ensure that one stream does not steal messages intended for
+# the other. Fortunately this is not our concern here, but rather that of the
+# high level code.
+
+procedure zardps (ps, buf, maxbytes, offset)
+
+int ps # pseudofile
+char buf[ARB] # buffer to receive data
+int maxbytes, maxchars # capacity of buffer
+long offset # ignored at present
+
+char numstr[SZ_NUMSTR]
+int nbytes, nchars, ndigits, ip, clin_chan, raw_mode
+int ctoi(), cl_psio_request(), fstati()
+include "clio.com"
+define ioerr_ 91
+
+begin
+ if (ps == STDOUT || ps == STDERR)
+ goto ioerr_
+ clin_chan = fstati (CLIN, F_CHANNEL)
+ raw_mode = fstati (ps, F_RAW)
+
+ # Send the XFER command to the parent. If raw mode is in effect on
+ # the pseudofile, request only a single char.
+
+ if (raw_mode == YES)
+ maxchars = 1
+ else
+ maxchars = maxbytes / SZB_CHAR
+
+ if (cl_psio_request ("xfer", ps, maxchars) == ERR)
+ goto ioerr_
+
+ # Get the number of chars to be read.
+ call zardpr (clin_chan, numstr, SZ_NUMSTR * SZB_CHAR, offset)
+ call zawtpr (clin_chan, nbytes)
+
+ if (nbytes < 0)
+ goto ioerr_
+ else
+ ndigits = nbytes / SZB_CHAR
+
+ # Decode count of chars in data block, a simple positive integer
+ # constant followed by a newline. The case of a single digit
+ # (nchars < 10) is optimized.
+
+ if (ndigits == 0)
+ nchars = 0
+ else if (ndigits == 1)
+ nchars = TO_INTEG (numstr[1])
+ else {
+ numstr[ndigits+1] = EOS
+ ip = 1
+ if (ctoi (numstr, ip, nchars) <= 0)
+ goto ioerr_
+ }
+
+ # Read the data.
+ nbytes = nchars * SZB_CHAR
+ if (nchars == 0)
+ ps_status[ps] = 0 # EOF
+ else {
+ call zardpr (clin_chan, buf, nbytes, offset)
+ call zawtpr (clin_chan, ps_status[ps])
+ }
+ return
+ioerr_
+ ps_status[ps] = ERR
+ return
+end
+
+
+# ZAWRPS -- Write primitive for a pseudofile. The write is initiated by
+# sending the following command to the CL:
+#
+# xmit(ps,nchars)\n
+#
+# where "ps" is the pseudofile number, and "nchars" is the number of chars
+# of binary data to be read from CLOUT and copied to the file connected to
+# pseudofile "ps" by the parent.
+
+procedure zawrps (ps, buf, nbytes, offset)
+
+int ps # pseudofile
+char buf[ARB] # buffer to receive data
+int nbytes # capacity of buffer
+long offset # ignored at present
+
+int nchars, clout_chan
+int cl_psio_request(), fstati()
+include "clio.com"
+define ioerr_ 91
+
+begin
+ if (ps == STDIN)
+ goto ioerr_
+ clout_chan = fstati (CLOUT, F_CHANNEL)
+
+ # Send the XMIT command to the parent.
+ nchars = nbytes / SZB_CHAR
+ if (cl_psio_request ("xmit", ps, nchars) == ERR)
+ goto ioerr_
+
+ # Send the data block.
+ call zawrpr (clout_chan, buf, nbytes, offset)
+ call zawtpr (clout_chan, ps_status[ps])
+ return
+ioerr_
+ ps_status[ps] = ERR
+ return
+end
+
+
+# ZAWTPS -- Wait for i/o to a pseudofile (required by the FIO interface,
+# though pseudofile i/o is not really asynchronous).
+
+procedure zawtps (ps, status)
+
+int ps # pseudofile code
+int status # nbytes transferred in last packed (output)
+include "clio.com"
+
+begin
+ status = ps_status[ps]
+end
+
+
+# ZSTTPS -- Channel status of a pseudofile. With the exception of the optimal
+# buffer size for STDERR we default to the IPC status parameters, since i/o
+# is ultimately over IPC channels to the parent process.
+
+procedure zsttps (ps, what, lvalue)
+
+int ps # pseudofile
+int what # status parameter requested
+long lvalue # output value (long)
+
+int fstati()
+
+begin
+ if (ps == STDERR && what == FSTT_OPTBUFSIZE)
+ lvalue = SZ_LINE * SZB_CHAR
+ else
+ call zsttpr (fstati(CLIN,F_CHANNEL), what, lvalue)
+end
+
+
+# CL_PSIO_REQUEST -- Output "cmd(arg1,arg2)\n" to CLOUT. Called by CL_ZARDPS
+# and CL_ZAWRPS to send the XMIT and XFER commands to the CL, when writing to
+# or reading from a pseudofile.
+
+int procedure cl_psio_request (cmd, arg1, arg2)
+
+char cmd[ARB] # e.g. "xmit" or "xfer"
+int arg1, arg2 # integer arguments
+
+int ip, status, clout_chan
+pointer obuf, sp, op
+long offset
+int itoc(), fstati()
+define output {Memc[op]=$1;op=op+1}
+
+begin
+ call smark (sp)
+ call salloc (obuf, SZ_PATHNAME, TY_CHAR)
+
+ clout_chan = fstati (CLOUT, F_CHANNEL)
+
+ op = obuf
+ for (ip=1; cmd[ip] != EOS; ip=ip+1)
+ output (cmd[ip])
+
+ # Encode argument list. Arguments are assumed to always be
+ # nonnegative. Optimized for simple single digit numbers.
+
+ output ('(')
+ if (arg1 < 10)
+ output (TO_DIGIT (arg1))
+ else
+ op = op + itoc (arg1, Memc[op], SZ_PATHNAME-(op-obuf))
+
+ output (',')
+
+ if (arg2 < 10)
+ output (TO_DIGIT (arg2))
+ else
+ op = op + itoc (arg2, Memc[op], SZ_PATHNAME-(op-obuf))
+
+ output (')')
+ output ('\n')
+
+ call zawrpr (clout_chan, Memc[obuf], (op-obuf) * SZB_CHAR, offset)
+ call zawtpr (clout_chan, status)
+
+ call sfree (sp)
+ return (status)
+end