diff options
Diffstat (limited to 'fig-utils/src/Fig/Utils')
| -rw-r--r-- | fig-utils/src/Fig/Utils/FFI.hs | 23 |
1 files changed, 23 insertions, 0 deletions
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 |
