Machine-Independent MDL for TOPS-20 and VAX.
[pdp10-muddle.git] / mim / development / mim / vax / mimlib / pipes.mud
1 <PACKAGE "PIPES">
2
3 <RENTRY PIPE>
4
5 <ENTRY GET-PIPE READ-DESC WRITE-DESC READ-SAFE-BUFFER>
6
7 <USE "NEWSTRUC">
8
9 <MSETG READ-DESC 1>
10 <MSETG WRITE-DESC 2>
11
12 <NEWSTRUC PIPE VECTOR
13           PIPE-IJFN <OR FIX FALSE>
14           PIPE-DEV <OR STRING FALSE>
15           PIPE-SNM FALSE
16           PIPE-NM1 FALSE
17           PIPE-NM2 FALSE
18           PIPE-DSN FALSE
19           PIPE-STATUS FIX
20           PIPE-OJFN <OR FIX FALSE>
21           PIPE-PIPE <UVECTOR [2 FIX]>
22           PIPE-BUF STRING>
23
24 <COND (<NOT <GASSIGNED? NEW-CHANNEL-TYPE>>
25        <SETG NEW-CHANNEL-TYPE ,TIME>)>
26
27 <NEW-CHANNEL-TYPE PIPE DEFAULT
28                   OPEN PIPE-OPEN
29                   CLOSE PIPE-CLOSE
30                   READ-SAFE-BUFFER PIPE-READ-SAFE
31                   READ-BUFFER PIPE-READ-BUFFER
32                   READ-BYTE PIPE-READ-BYTE
33                   WRITE-BUFFER PIPE-WRITE-BUFFER
34                   WRITE-BYTE PIPE-WRITE-BYTE
35                   GET-PIPE GET-PIPE>
36
37 <SETG LEN-BUF <UVECTOR 0>>
38 <GDECL (LEN-BUF) UVECTOR>
39
40 <DEFINE PIPE-OPEN (STYPE OPER "TUPLE" STUFF "AUX" (PUV <UVECTOR 0 0>) RES)
41   #DECL ((PUV) UVECTOR (RES) <OR UVECTOR FALSE>)
42   <COND (<SET RES <CALL PIPE .PUV>>
43          <CHTYPE [<READ-DESC .PUV>
44                   <> <> <> <> <> 0
45                   <WRITE-DESC .PUV> .PUV " "] PIPE>)>>
46
47 <DEFINE PIPE-CLOSE (CHANNEL OPER "OPTIONAL" (WHICH <>)
48                     "AUX" (PIPE <CHANNEL-DATA .CHANNEL>) JFN)
49   #DECL ((CHANNEL) CHANNEL (PIPE) PIPE)
50   <COND (.WHICH
51          <SET JFN <NTH <PIPE-PIPE .PIPE> .WHICH>>
52          <CALL SYSCALL CLOSE .JFN>
53          <COND (<==? .WHICH ,READ-DESC>
54                 <PIPE-IJFN .PIPE <>>)
55                (<PIPE-OJFN .PIPE <>>)>)
56         (T
57          <COND (<PIPE-IJFN .PIPE><CALL SYSCALL CLOSE <PIPE-IJFN .PIPE>>)>
58          <COND (<PIPE-OJFN .PIPE><CALL SYSCALL CLOSE <PIPE-OJFN .PIPE>>)>)>>
59
60 <DEFINE PIPE-READ-SAFE (CHANNEL OPER STRING "OPTIONAL" (LEN <LENGTH .STRING>)
61                         "AUX" (PIPE <CHANNEL-DATA .CHANNEL>) RES
62                         (BUF ,LEN-BUF))
63   #DECL ((CHANNEL) CHANNEL (LEN) FIX (STRING) STRING (PIPE) PIPE
64          (BUF) UVECTOR)
65   <COND (<SET RES <CALL SYSCALL IOCTL <PIPE-IJFN .PIPE> ,FIONREAD .BUF>>
66          <SET LEN <MIN .LEN <1 .BUF> <LENGTH .STRING>>>
67          <COND (<G? .LEN 0>
68                 <COND (<SET RES <CALL SYSCALL READ
69                                       <PIPE-IJFN .PIPE> .STRING .LEN>>
70                        .RES)
71                       (T .RES)>)
72                (0)>)>>
73
74 <DEFINE PIPE-READ-BUFFER (CHANNEL OPER STRING "OPTIONAL" (LEN <LENGTH .STRING>)
75                           "AUX" (PIPE <CHANNEL-DATA .CHANNEL>) RES)
76   #DECL ((CHANNEL) CHANNEL (STRING) STRING (LEN) FIX (PIPE) PIPE)
77   <COND (<SET RES <ISYSCALL READ <PIPE-IJFN .PIPE> .STRING .LEN>>
78          .RES)
79         (T .RES)>>
80
81 <DEFINE PIPE-READ-BYTE (CHANNEL OPER "AUX" (PIPE <CHANNEL-DATA .CHANNEL>) RES)
82   #DECL ((CHANNEL) CHANNEL (PIPE) PIPE)
83   <COND (<SET RES <ISYSCALL READ <PIPE-IJFN .PIPE> <PIPE-BUF .PIPE> 1>>
84          <1 <PIPE-BUF .PIPE>>)
85         (T .RES)>>
86
87 <DEFINE PIPE-WRITE-BUFFER (CHANNEL OPER BUF "OPTIONAL" (LEN <LENGTH .BUF>)
88                            "AUX" (PIPE <CHANNEL-DATA .CHANNEL>) RES)
89   #DECL ((CHANNEL) CHANNEL (BUF) STRING (LEN) FIX (PIPE) PIPE)
90   <COND (<SET RES <CALL SYSCALL WRITE <PIPE-OJFN .PIPE> .BUF .LEN>>
91          .RES)
92         (T .RES)>>
93
94 <DEFINE PIPE-WRITE-BYTE (CHANNEL OPER BYTE "AUX" (PIPE <CHANNEL-DATA .CHANNEL>)
95                          RES (BUF <PIPE-BUF .PIPE>))
96   #DECL ((CHANNEL) CHANNEL (BYTE) CHARACTER (PIPE) PIPE (BUF) STRING)
97   <1 .BUF .BYTE>
98   <COND (<SET RES <CALL SYSCALL WRITE <PIPE-OFJN .PIPE> .BUF 1>>
99          .BYTE)
100         (T .RES)>>
101
102 <DEFINE GET-PIPE (CHANNEL OPER "AUX" (PIPE <CHANNEL-DATA .CHANNEL>))
103   #DECL ((CHANNEL) CHANNEL (PIPE) PIPE)
104   <PIPE-PIPE .PIPE>>
105
106 <ENDPACKAGE>