0 | module System.UV.Raw.Pointer
3 | import Derive.Prelude
4 | import System.UV.Raw.Util
5 | import public System.FFI
6 | import public System.UV.Data.Pointer
8 | %language ElabReflection
16 | data Buf : Type where
19 | data Loop : Type where
27 | getString : Ptr Char -> String
28 | getString p = prim__getString (believe_me p)
33 | getStringMay : Ptr Char -> Maybe String
35 | case prim__nullPtr p of
36 | 0 => Just $
getString p
43 | %foreign "scheme:blodwen-new-buffer"
45 | "node:lambda:s=>Buffer.alloc(s)"
46 | prim__newBuffer : Bits32 -> PrimIO Buffer
48 | %foreign (idris_uv "uv_set_buf_len")
49 | uv_set_buf_len : Ptr Buf -> Bits32 -> PrimIO ()
51 | %foreign (idris_uv "uv_set_buf_base")
52 | uv_set_buf_base : Ptr Buf -> Ptr Bits8 -> PrimIO ()
54 | %foreign (idris_uv "uv_get_buf_len")
55 | uv_get_buf_len : Ptr Buf -> PrimIO Bits32
57 | %foreign (idris_uv "uv_get_buf_base")
58 | uv_get_buf_base : Ptr Buf -> PrimIO (Ptr Bits8)
60 | %foreign (idris_uv "uv_copy_buf")
61 | uv_copy_to_buf : Ptr Bits8 -> Buffer -> Bits32 -> PrimIO ()
63 | %foreign (idris_uv "uv_copy_from_buf")
64 | uv_copy_from_buf : Buffer -> Ptr Bits8 -> (size, offset : Bits32) -> PrimIO ()
66 | %foreign "scheme:blodwen-buffer-getstring"
67 | uv_get_string : Ptr Bits8 -> (offset, len : Bits32) -> PrimIO String
74 | data Async : Type where
77 | data Check : Type where
80 | data FsEvent : Type where
83 | data FsPoll : Type where
86 | data Handle : Type where
89 | data Idle : Type where
92 | data Pipe : Type where
95 | data Poll : Type where
98 | data Prepare : Type where
101 | data Process : Type where
104 | data Stream : Type where
107 | data Tcp : Type where
110 | data Timer : Type where
113 | data Tty : Type where
116 | data Udp : Type where
119 | data Signal : Type where
126 | data Req : Type where
129 | data Connect : Type where
132 | data Write : Type where
135 | data Shutdown : Type where
138 | data UpdSend : Type where
141 | data Fs : Type where
144 | data Work : Type where
147 | data GetAddrInfo : Type where
150 | data GetNameInfo : Type where
157 | data AddrInfo : Type where
160 | data SockAddr : Type where
163 | data SockAddrIn : Type where
166 | data SockAddrIn6 : Type where
176 | data PSize : (a : Type) -> (s : Bits32) -> Type where
178 | ASYNC : PSize Async SZ_ASYNC
179 | CHECK : PSize Check SZ_CHECK
180 | FS_EVENT : PSize FsEvent SZ_FS_EVENT
181 | FS_POLL : PSize FsPoll SZ_FS_POLL
182 | HANDLE : PSize Handle SZ_HANDLE
183 | IDLE : PSize Idle SZ_IDLE
184 | NAMEDPIPE : PSize Pipe SZ_NAMED_PIPE
185 | POLL : PSize Poll SZ_POLL
186 | PREPARE : PSize Prepare SZ_PREPARE
187 | PROCESS : PSize Process SZ_PROCESS
188 | STREAM : PSize Stream SZ_STREAM
189 | TCP : PSize Tcp SZ_TCP
190 | TIMER : PSize Timer SZ_TIMER
191 | TTY : PSize Tty SZ_TTY
192 | UDP : PSize Udp SZ_UDP
193 | SIGNAL : PSize Signal SZ_SIGNAL
194 | REQ : PSize Req SZ_REQ
195 | CONNECT : PSize Connect SZ_CONNECT
196 | WRITE : PSize Write SZ_WRITE
197 | SHUTDOWN : PSize Shutdown SZ_SHUTDOWN
198 | FS : PSize Fs SZ_FS
199 | WORK : PSize Work SZ_WORK
200 | GETADDRINFO : PSize GetAddrInfo SZ_GETADDRINFO
201 | GETNAMEINFO : PSize GetNameInfo SZ_GETNAMEINFO
202 | ADDRINFO : PSize AddrInfo SZ_ADDRINFO
203 | SOCKADDR : PSize SockAddr SZ_SOCKADDR
204 | SOCKADDRIN : PSize SockAddrIn SZ_SOCKADDR_IN
205 | SOCKADDRIN6 : PSize SockAddrIn6 SZ_SOCKADDR_IN6
206 | BUF : PSize Buf SZ_BUF
207 | LOOP : PSize Loop SZ_LOOP
208 | BYTE : PSize Bits8 1
209 | CHAR : PSize Char 1
211 | %runElab deriveIndexed "PSize" [Show]
216 | {auto has : HasIO io}
219 | -> {auto 0 prf : PSize a s}
221 | mallocPtr _ = prim__castPtr <$> malloc (cast s)
226 | {auto has : HasIO io}
229 | -> {auto 0 prf : PSize a s}
230 | -> (numPtrs : Bits32)
232 | mallocPtrs _ numPtrs = prim__castPtr <$> malloc (cast $
s * numPtrs)
236 | freePtr : HasIO io => Ptr t -> io ()
237 | freePtr = free . prim__forgetPtr
253 | data PCast : Type -> Type -> Type where
255 | AsyncHandle : PCast Async Handle
256 | CheckHandle : PCast Check Handle
257 | Fs_eventHandle : PCast FsEvent Handle
258 | Fs_pollHandle : PCast FsPoll Handle
259 | IdleHandle : PCast Idle Handle
260 | NamedpipeHandle : PCast Pipe Handle
261 | PollHandle : PCast Poll Handle
262 | PrepareHandle : PCast Prepare Handle
263 | ProcessHandle : PCast Process Handle
264 | StreamHandle : PCast Stream Handle
265 | TcpHandle : PCast Tcp Handle
266 | TimerHandle : PCast Timer Handle
267 | TtyHandle : PCast Tty Handle
268 | UdpHandle : PCast Udp Handle
269 | SignalHandle : PCast Signal Handle
270 | StreamStream : PCast Stream Stream
271 | TcpStream : PCast Tcp Stream
272 | PipeStream : PCast Pipe Stream
273 | TtyStream : PCast Tty Stream
274 | IP4Addr : PCast SockAddrIn SockAddr
275 | RevIP4Addr : PCast SockAddr SockAddrIn
276 | IP6Addr : PCast SockAddrIn6 SockAddr
277 | ConnectReq : PCast Connect Req
278 | WriteReq : PCast Write Req
279 | ShutdownReq : PCast Shutdown Req
280 | UpdSendReq : PCast UpdSend Req
281 | FsReq : PCast Fs Req
282 | WorkReq : PCast Work Req
283 | GetAddrInfoReq : PCast GetAddrInfo Req
284 | GetNameInfoReq : PCast GetNameInfo Req
285 | ByteChar : PCast Bits8 Char
286 | CharByte : PCast Char Bits8
289 | castPtr : (0 _ : PCast s t) => Ptr s -> Ptr t
290 | castPtr = believe_me
297 | newBuffer : HasIO io => Bits32 -> io Buffer
298 | newBuffer s = primIO $
prim__newBuffer s
301 | setBufLen : HasIO io => Ptr Buf -> Bits32 -> io ()
302 | setBufLen p s = primIO $
uv_set_buf_len p s
305 | getBufLen : HasIO io => Ptr Buf -> io Bits32
306 | getBufLen p = primIO $
uv_get_buf_len p
309 | setBufBase : HasIO io => Ptr Buf -> Ptr Bits8 -> io ()
310 | setBufBase p s = primIO $
uv_set_buf_base p s
313 | getBufBase : HasIO io => Ptr Buf -> io (Ptr Bits8)
314 | getBufBase p = primIO $
uv_get_buf_base p
317 | initBuf : HasIO io => Ptr Buf -> Ptr Bits8 -> Bits32 -> io ()
318 | initBuf pbuf pcs len = do
319 | setBufBase pbuf pcs
324 | freeBufBase : HasIO io => Ptr Buf -> io ()
325 | freeBufBase buf = getBufBase buf >>= freePtr
330 | copyToBuffer : HasIO io => Ptr Bits8 -> Buffer -> Bits32 -> io ()
331 | copyToBuffer p buf x = primIO $
uv_copy_to_buf p buf x
336 | copyBufToBuffer : HasIO io => Ptr Buf -> Buffer -> Bits32 -> io ()
337 | copyBufToBuffer p buf s = getBufBase p >>= \x => copyToBuffer x buf s
342 | copyFromBuffer : HasIO io => Buffer -> (size, offset : Bits32) -> io (Ptr Bits8)
343 | copyFromBuffer buf size offset = do
344 | pchar <- mallocPtrs Bits8 size
345 | primIO $
uv_copy_from_buf buf pchar size offset