Machine-Independent MDL for TOPS-20 and VAX.
[pdp10-muddle.git] / mim / development / mim / vax / mimlib / pipes.mud
diff --git a/mim/development/mim/vax/mimlib/pipes.mud b/mim/development/mim/vax/mimlib/pipes.mud
new file mode 100644 (file)
index 0000000..debcffc
--- /dev/null
@@ -0,0 +1,106 @@
+<PACKAGE "PIPES">
+
+<RENTRY PIPE>
+
+<ENTRY GET-PIPE READ-DESC WRITE-DESC READ-SAFE-BUFFER>
+
+<USE "NEWSTRUC">
+
+<MSETG READ-DESC 1>
+<MSETG WRITE-DESC 2>
+
+<NEWSTRUC PIPE VECTOR
+         PIPE-IJFN <OR FIX FALSE>
+         PIPE-DEV <OR STRING FALSE>
+         PIPE-SNM FALSE
+         PIPE-NM1 FALSE
+         PIPE-NM2 FALSE
+         PIPE-DSN FALSE
+         PIPE-STATUS FIX
+         PIPE-OJFN <OR FIX FALSE>
+         PIPE-PIPE <UVECTOR [2 FIX]>
+         PIPE-BUF STRING>
+
+<COND (<NOT <GASSIGNED? NEW-CHANNEL-TYPE>>
+       <SETG NEW-CHANNEL-TYPE ,TIME>)>
+
+<NEW-CHANNEL-TYPE PIPE DEFAULT
+                 OPEN PIPE-OPEN
+                 CLOSE PIPE-CLOSE
+                 READ-SAFE-BUFFER PIPE-READ-SAFE
+                 READ-BUFFER PIPE-READ-BUFFER
+                 READ-BYTE PIPE-READ-BYTE
+                 WRITE-BUFFER PIPE-WRITE-BUFFER
+                 WRITE-BYTE PIPE-WRITE-BYTE
+                 GET-PIPE GET-PIPE>
+
+<SETG LEN-BUF <UVECTOR 0>>
+<GDECL (LEN-BUF) UVECTOR>
+
+<DEFINE PIPE-OPEN (STYPE OPER "TUPLE" STUFF "AUX" (PUV <UVECTOR 0 0>) RES)
+  #DECL ((PUV) UVECTOR (RES) <OR UVECTOR FALSE>)
+  <COND (<SET RES <CALL PIPE .PUV>>
+        <CHTYPE [<READ-DESC .PUV>
+                 <> <> <> <> <> 0
+                 <WRITE-DESC .PUV> .PUV " "] PIPE>)>>
+
+<DEFINE PIPE-CLOSE (CHANNEL OPER "OPTIONAL" (WHICH <>)
+                   "AUX" (PIPE <CHANNEL-DATA .CHANNEL>) JFN)
+  #DECL ((CHANNEL) CHANNEL (PIPE) PIPE)
+  <COND (.WHICH
+        <SET JFN <NTH <PIPE-PIPE .PIPE> .WHICH>>
+        <CALL SYSCALL CLOSE .JFN>
+        <COND (<==? .WHICH ,READ-DESC>
+               <PIPE-IJFN .PIPE <>>)
+              (<PIPE-OJFN .PIPE <>>)>)
+       (T
+        <COND (<PIPE-IJFN .PIPE><CALL SYSCALL CLOSE <PIPE-IJFN .PIPE>>)>
+        <COND (<PIPE-OJFN .PIPE><CALL SYSCALL CLOSE <PIPE-OJFN .PIPE>>)>)>>
+
+<DEFINE PIPE-READ-SAFE (CHANNEL OPER STRING "OPTIONAL" (LEN <LENGTH .STRING>)
+                       "AUX" (PIPE <CHANNEL-DATA .CHANNEL>) RES
+                       (BUF ,LEN-BUF))
+  #DECL ((CHANNEL) CHANNEL (LEN) FIX (STRING) STRING (PIPE) PIPE
+        (BUF) UVECTOR)
+  <COND (<SET RES <CALL SYSCALL IOCTL <PIPE-IJFN .PIPE> ,FIONREAD .BUF>>
+        <SET LEN <MIN .LEN <1 .BUF> <LENGTH .STRING>>>
+        <COND (<G? .LEN 0>
+               <COND (<SET RES <CALL SYSCALL READ
+                                     <PIPE-IJFN .PIPE> .STRING .LEN>>
+                      .RES)
+                     (T .RES)>)
+              (0)>)>>
+
+<DEFINE PIPE-READ-BUFFER (CHANNEL OPER STRING "OPTIONAL" (LEN <LENGTH .STRING>)
+                         "AUX" (PIPE <CHANNEL-DATA .CHANNEL>) RES)
+  #DECL ((CHANNEL) CHANNEL (STRING) STRING (LEN) FIX (PIPE) PIPE)
+  <COND (<SET RES <ISYSCALL READ <PIPE-IJFN .PIPE> .STRING .LEN>>
+        .RES)
+       (T .RES)>>
+
+<DEFINE PIPE-READ-BYTE (CHANNEL OPER "AUX" (PIPE <CHANNEL-DATA .CHANNEL>) RES)
+  #DECL ((CHANNEL) CHANNEL (PIPE) PIPE)
+  <COND (<SET RES <ISYSCALL READ <PIPE-IJFN .PIPE> <PIPE-BUF .PIPE> 1>>
+        <1 <PIPE-BUF .PIPE>>)
+       (T .RES)>>
+
+<DEFINE PIPE-WRITE-BUFFER (CHANNEL OPER BUF "OPTIONAL" (LEN <LENGTH .BUF>)
+                          "AUX" (PIPE <CHANNEL-DATA .CHANNEL>) RES)
+  #DECL ((CHANNEL) CHANNEL (BUF) STRING (LEN) FIX (PIPE) PIPE)
+  <COND (<SET RES <CALL SYSCALL WRITE <PIPE-OJFN .PIPE> .BUF .LEN>>
+        .RES)
+       (T .RES)>>
+
+<DEFINE PIPE-WRITE-BYTE (CHANNEL OPER BYTE "AUX" (PIPE <CHANNEL-DATA .CHANNEL>)
+                        RES (BUF <PIPE-BUF .PIPE>))
+  #DECL ((CHANNEL) CHANNEL (BYTE) CHARACTER (PIPE) PIPE (BUF) STRING)
+  <1 .BUF .BYTE>
+  <COND (<SET RES <CALL SYSCALL WRITE <PIPE-OFJN .PIPE> .BUF 1>>
+        .BYTE)
+       (T .RES)>>
+
+<DEFINE GET-PIPE (CHANNEL OPER "AUX" (PIPE <CHANNEL-DATA .CHANNEL>))
+  #DECL ((CHANNEL) CHANNEL (PIPE) PIPE)
+  <PIPE-PIPE .PIPE>>
+
+<ENDPACKAGE>