shithub: MicroHs

Download patch

ref: 7f3da47a8e1a1e6c6f9d63946ad84ed589310a17
parent: cfd47722e3147d6ac70239ac5209947a12cd21a5
author: Lennart Augustsson <lennart@augustsson.net>
date: Tue Jan 14 05:48:55 EST 2025

More foreign string functions.

--- a/lib/Foreign/C/String.hs
+++ b/lib/Foreign/C/String.hs
@@ -2,8 +2,10 @@
   CString, CStringLen,
   newCAString, newCAStringLen,
   peekCAString, peekCAStringLen,
-  withCAString,
-  peekCString,
+  withCAString, withCAStringLen,
+  newCString, newCStringLen,
+  peekCString, peekCStringLen,
+  withCString, withCStringLen,
   ) where
 import Prelude()              -- do not import Prelude
 import Primitives
@@ -27,6 +29,13 @@
   free cs `primThen`
   primReturn a
 
+withCAStringLen :: forall a . String -> (CStringLen -> IO a) -> IO a
+withCAStringLen s io =
+  newCAStringLen s `primBind` \ cs@(p, _) ->
+  io cs `primBind` \ a ->
+  free p `primThen`
+  primReturn a
+
 peekCAString :: CString -> IO String
 peekCAString = primPeekCAString
 
@@ -33,7 +42,23 @@
 peekCAStringLen :: CStringLen -> IO String
 peekCAStringLen (p, i) = primPeekCAStringLen p i
 
--- Not quite right
+------------------------------------------------------
+-- XXX:  No encoding!
+
+newCString :: String -> IO CString
+newCString = newCAString
+
+newCStringLen :: String -> IO CStringLen
+newCStringLen = newCAStringLen
+
+withCString :: forall a . String -> (CString -> IO a) -> IO a
+withCString = withCAString
+
+withCStringLen :: forall a . String -> (CStringLen -> IO a) -> IO a
+withCStringLen = withCAStringLen
+
 peekCString :: CString -> IO String
-peekCString = primPeekCAString
+peekCString = peekCAString
 
+peekCStringLen :: CStringLen -> IO String
+peekCStringLen = peekCAStringLen