diff options
Diffstat (limited to 'src/runtime/haskell-bind/PGF2/FFI.hs')
| -rw-r--r-- | src/runtime/haskell-bind/PGF2/FFI.hs | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/src/runtime/haskell-bind/PGF2/FFI.hs b/src/runtime/haskell-bind/PGF2/FFI.hs new file mode 100644 index 000000000..c0a9adf0a --- /dev/null +++ b/src/runtime/haskell-bind/PGF2/FFI.hs @@ -0,0 +1,154 @@ +{-# LANGUAGE ForeignFunctionInterface #-} + +module PGF2.FFI where + +import Foreign.C +import Foreign.C.String +import Foreign.Ptr +import Foreign.ForeignPtr +import Control.Exception + +------------------------------------------------------------------ +-- libgu API + +data GuEnum +data GuExn +data GuIn +data GuKind +data GuString +data GuStringBuf +data GuMapItor +data GuOut +data GuPool + +foreign import ccall "gu/mem.h gu_new_pool" + gu_new_pool :: IO (Ptr GuPool) + +foreign import ccall "gu/mem.h gu_pool_free" + gu_pool_free :: Ptr GuPool -> IO () + +foreign import ccall "gu/mem.h &gu_pool_free" + gu_pool_finalizer :: FinalizerPtr GuPool + +foreign import ccall "gu/exn.h gu_new_exn" + gu_new_exn :: Ptr GuExn -> Ptr GuKind -> Ptr GuPool -> IO (Ptr GuExn) + +foreign import ccall "gu/exn.h gu_exn_is_raised" + gu_exn_is_raised :: Ptr GuExn -> IO Bool + +foreign import ccall "gu/type.h &gu_type__type" + gu_type__type :: Ptr GuKind + +foreign import ccall "gu/string.h gu_string_in" + gu_string_in :: CString -> Ptr GuPool -> IO (Ptr GuIn) + +foreign import ccall "gu/string.h gu_string_buf" + gu_string_buf :: Ptr GuPool -> IO (Ptr GuStringBuf) + +foreign import ccall "gu/string.h gu_string_buf_out" + gu_string_buf_out :: Ptr GuStringBuf -> IO (Ptr GuOut) + +foreign import ccall "gu/enum.h gu_enum_next" + gu_enum_next :: Ptr a -> Ptr (Ptr b) -> Ptr GuPool -> IO () + +foreign import ccall "gu/string.h gu_string_buf_freeze" + gu_string_buf_freeze :: Ptr GuStringBuf -> Ptr GuPool -> IO CString + +withGuPool :: (Ptr GuPool -> IO a) -> IO a +withGuPool f = bracket gu_new_pool gu_pool_free f + + +------------------------------------------------------------------ +-- libpgf API + +data PgfPGF +data PgfApplication +data PgfConcr +type PgfExpr = Ptr () +data PgfExprProb +data PgfFullFormEntry +data PgfMorphoCallback +data PgfPrintContext +data PgfType + +foreign import ccall "pgf/pgf.h pgf_read" + pgf_read :: CString -> Ptr GuPool -> Ptr GuExn -> IO (Ptr PgfPGF) + +foreign import ccall "pgf/pgf.h pgf_abstract_name" + pgf_abstract_name :: Ptr PgfPGF -> IO CString + +foreign import ccall "pgf/pgf.h pgf_iter_languages" + pgf_iter_languages :: Ptr PgfPGF -> Ptr GuMapItor -> Ptr GuExn -> IO () + +foreign import ccall "pgf/pgf.h pgf_get_language" + pgf_get_language :: Ptr PgfPGF -> CString -> IO (Ptr PgfConcr) + +foreign import ccall "pgf/pgf.h pgf_concrete_name" + pgf_concrete_name :: Ptr PgfConcr -> IO CString + +foreign import ccall "pgf/pgf.h pgf_language_code" + pgf_language_code :: Ptr PgfConcr -> IO CString + +foreign import ccall "pgf/pgf.h pgf_iter_categories" + pgf_iter_categories :: Ptr PgfPGF -> Ptr GuMapItor -> Ptr GuExn -> IO () + +foreign import ccall "pgf/pgf.h pgf_start_cat" + pgf_start_cat :: Ptr PgfPGF -> IO CString + +foreign import ccall "pgf/pgf.h pgf_iter_functions" + pgf_iter_functions :: Ptr PgfPGF -> Ptr GuMapItor -> Ptr GuExn -> IO () + +foreign import ccall "pgf/pgf.h pgf_iter_functions_by_cat" + pgf_iter_functions_by_cat :: Ptr PgfPGF -> Ptr GuMapItor -> Ptr GuExn -> IO () + +foreign import ccall "pgf/pgf.h pgf_function_type" + pgf_function_type :: Ptr PgfPGF -> CString -> IO (Ptr PgfType) + +foreign import ccall "pgf/pgf.h pgf_print_name" + pgf_print_name :: Ptr PgfConcr -> CString -> IO CString + +foreign import ccall "pgf/pgf.h pgf_linearize" + pgf_linearize :: Ptr PgfConcr -> PgfExpr -> Ptr GuOut -> Ptr GuExn -> IO () + +foreign import ccall "pgf/pgf.h pgf_parse" + pgf_parse :: Ptr PgfConcr -> CString -> CString -> Ptr GuExn -> Ptr GuPool -> Ptr GuPool -> IO (Ptr GuEnum) + +foreign import ccall "pgf/pgf.h pgf_lookup_morpho" + pgf_lookup_morpho :: Ptr PgfConcr -> CString -> Ptr PgfMorphoCallback -> Ptr GuExn -> IO () + +type LookupMorphoCallback = Ptr PgfMorphoCallback -> CString -> CString -> Float -> Ptr GuExn -> IO () + +foreign import ccall "wrapper" + wrapLookupMorphoCallback :: LookupMorphoCallback -> IO (FunPtr LookupMorphoCallback) + +type MapItorCallback = Ptr GuMapItor -> Ptr () -> Ptr () -> Ptr GuExn -> IO () + +foreign import ccall "wrapper" + wrapMapItorCallback :: MapItorCallback -> IO (FunPtr MapItorCallback) + +foreign import ccall "pgf/pgf.h pgf_fullform_lexicon" + pgf_fullform_lexicon :: Ptr PgfConcr -> Ptr GuPool -> IO (Ptr GuEnum) + +foreign import ccall "pgf/pgf.h pgf_fullform_get_string" + pgf_fullform_get_string :: Ptr PgfFullFormEntry -> IO CString + +foreign import ccall "pgf/pgf.h pgf_fullform_get_analyses" + pgf_fullform_get_analyses :: Ptr PgfFullFormEntry -> Ptr PgfMorphoCallback -> Ptr GuExn -> IO () + +foreign import ccall "pgf/pgf.h pgf_expr_unapply" + pgf_expr_unapply :: PgfExpr -> Ptr GuPool -> IO (Ptr PgfApplication) + +foreign import ccall "pgf/expr.h pgf_expr_arity" + pgf_expr_arity :: PgfExpr -> IO Int + +foreign import ccall "pgf/expr.h pgf_print_expr" + pgf_print_expr :: PgfExpr -> Ptr PgfPrintContext -> Int -> Ptr GuOut -> Ptr GuExn -> IO () + +foreign import ccall "pgf/pgf.h pgf_generate_all" + pgf_generate_all :: Ptr PgfPGF -> CString -> Ptr GuPool -> IO (Ptr GuEnum) + +foreign import ccall "pgf/pgf.h pgf_print" + pgf_print :: Ptr PgfPGF -> Ptr GuOut -> Ptr GuExn -> IO () + +foreign import ccall "pgf/expr.h pgf_read_expr" + pgf_read_expr :: Ptr GuIn -> Ptr GuPool -> Ptr GuExn -> IO PgfExpr |
