<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">I’m on board with this import, but we’ll need to get the type right if we’re going to bind to libc’s strlen directly<div class=""><br class=""></div><div class="">foreign import unsafe "strlen"<br class="">  cstringLength :: CString -> IO CSize<br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Jan 22, 2021, at 6:04 PM, chessai <<a href="mailto:chessai1996@gmail.com" class="">chessai1996@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="auto" class=""><div class="">I agree with Andrew, let's just export the lifted ffi call<div dir="auto" class=""><br class=""></div><div dir="auto" class="">This suits my needs, but, regardless of my needs, seems like a perfectly sensible addition to Foreign.C.String</div><div dir="auto" class=""><br class=""></div><div dir="auto" class="">Concrete addition:</div><div dir="auto" class=""><br class=""></div><div dir="auto" class="">foreign import unsafe "strlen"</div><div dir="auto" class="">  cstringLength :: CString -> IO Int</div><br class=""><br class=""><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Jan 22, 2021, 17:09 Viktor Dukhovni <<a href="mailto:ietf-dane@dukhovni.org" class="">ietf-dane@dukhovni.org</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Fri, Jan 22, 2021 at 04:56:33PM -0500, Andrew Martin wrote:<br class="">
<br class="">
> This will eventually be used to great effect in bytestring. See<br class="">
> <a href="https://github.com/haskell/bytestring/pull/191" rel="noreferrer noreferrer" target="_blank" class="">https://github.com/haskell/bytestring/pull/191</a>.<br class="">
<br class="">
Yes, you might recall that I'm well aware of that (already merged) PR,<br class="">
indeed that's how I happened to recall that cstringLength# is present<br class="">
in 9.0.<br class="">
<br class="">
> To get back to the original question, I think that any user-facing<br class="">
> cstringLength function should probably be:<br class="">
> <br class="">
>     cstringLength :: CString -> IO Int<br class="">
> <br class="">
> We need a separate FFI call that returns its result in IO to<br class="">
> accomplish this. But this just be done in base rather than ghc-prim.<br class="">
> There are no interesting rewrite rules that exist for such a function.<br class="">
<br class="">
So I guess your suggestion in response to @chessai's original post:<br class="">
<br class="">
>> On Wed, Jan 20, 2021 at 09:54:30AM -0800, chessai wrote:<br class="">
>> <br class="">
>> I've wanted the following before:<br class="">
>> <br class="">
>> foreign import ccall unsafe "strlen"<br class="">
>>   cstringLength# :: Addr# -> Int#<br class="">
>> <br class="">
>> cstringLength :: CString -> Int<br class="">
>> cstringLength (Ptr s) = I# (cstringLength# s)<br class="">
>> <br class="">
>> A natural place for this seems to be Foreign.C.String.<br class="">
<br class="">
would be to instead directly implement the lifted FFI variant:<br class="">
<br class="">
    foreign import ccall unsafe "strlen"<br class="">
      cstringLength :: CString -> IO Int<br class="">
<br class="">
which probably would not need a wrapper and can be exported directly.<br class="">
<br class="">
    module Main (main) where<br class="">
    import Control.Monad ( (>=>) )<br class="">
    import Foreign.C.String (CString, withCString)<br class="">
<br class="">
    foreign import ccall unsafe "strlen"<br class="">
      cstringLength :: CString -> IO Int<br class="">
<br class="">
    main :: IO ()<br class="">
    main = withCString "Hello, World!" $ cstringLength >=> print<br class="">
<br class="">
The cost of this safety net is that it results in more sequencing than<br class="">
is strictly necessary.  It is enough for the enclosing IO action to not<br class="">
embed the length in its result in some not yet fully evaluated thunk.<br class="">
<br class="">
I guess @chessai can let us know whether the more strictly sequenced<br class="">
variant meets his needs.<br class="">
<br class="">
-- <br class="">
    Viktor.<br class="">
_______________________________________________<br class="">
Libraries mailing list<br class="">
<a href="mailto:Libraries@haskell.org" target="_blank" rel="noreferrer" class="">Libraries@haskell.org</a><br class="">
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries" rel="noreferrer noreferrer" target="_blank" class="">http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries</a><br class="">
</blockquote></div></div></div>
_______________________________________________<br class="">Libraries mailing list<br class=""><a href="mailto:Libraries@haskell.org" class="">Libraries@haskell.org</a><br class="">http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries<br class=""></div></blockquote></div><br class=""></div></body></html>