From 7c3e41979478d6826f73a956a26c967aae1687a2 Mon Sep 17 00:00:00 2001 From: LLLL Colonq Date: Mon, 16 Jun 2025 03:33:52 -0400 Subject: fig-utils: Guile FFI --- fig-utils/src/Fig/Utils/FFI.hs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 fig-utils/src/Fig/Utils/FFI.hs (limited to 'fig-utils/src/Fig/Utils/FFI.hs') diff --git a/fig-utils/src/Fig/Utils/FFI.hs b/fig-utils/src/Fig/Utils/FFI.hs new file mode 100644 index 0000000..b5ee80e --- /dev/null +++ b/fig-utils/src/Fig/Utils/FFI.hs @@ -0,0 +1,23 @@ +module Fig.Utils.FFI where + +import Fig.Prelude + +import Foreign.Ptr (Ptr, nullPtr) +import Foreign.Storable (Storable(..)) +import Foreign.C.String +import Foreign.Marshal.Alloc + +foreign import ccall "check_answer" c_check_answer :: Ptr CString -> CString -> CString -> IO Int + +checkAnswer :: Text -> Text -> IO (Either Text Bool) +checkAnswer tcode tanswer = + withCString (unpack tcode) $ \code -> + withCString (unpack tanswer) $ \answer -> + alloca $ \rerr -> do + res <- c_check_answer rerr code answer + err <- peek rerr + if err == nullPtr + then pure . Right $ res /= 0 + else do + msg <- peekCString err + pure . Left $ pack msg -- cgit v1.2.3