diff options
| author | Krasimir Angelov <kr.angelov@gmail.com> | 2017-09-28 16:33:34 +0200 |
|---|---|---|
| committer | Krasimir Angelov <kr.angelov@gmail.com> | 2017-09-28 16:33:34 +0200 |
| commit | f2bc7ec7b64973bd8147d4394a937d6c491a71fd (patch) | |
| tree | 092e61c75bfc8cd9e80417527ef36742c98e37ae /src/runtime/haskell-bind/PGF2/FFI.hsc | |
| parent | 1c04fa4897acfa2119fa32850bfcd6550b712da4 (diff) | |
added exprSubstitute in the C runtime for substituting meta variables
Diffstat (limited to 'src/runtime/haskell-bind/PGF2/FFI.hsc')
| -rw-r--r-- | src/runtime/haskell-bind/PGF2/FFI.hsc | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/src/runtime/haskell-bind/PGF2/FFI.hsc b/src/runtime/haskell-bind/PGF2/FFI.hsc index c095e663f..71e4b488f 100644 --- a/src/runtime/haskell-bind/PGF2/FFI.hsc +++ b/src/runtime/haskell-bind/PGF2/FFI.hsc @@ -7,7 +7,7 @@ module PGF2.FFI where #include <gu/utf8.h> #include <pgf/pgf.h> -import Foreign ( alloca, peek, poke ) +import Foreign ( alloca, peek, poke, peekByteOff ) import Foreign.C import Foreign.Ptr import Foreign.ForeignPtr @@ -216,6 +216,27 @@ utf8Length s = count 0 s where ucs = fromEnum x +peekSequence peekElem size ptr = do + c_len <- (#peek GuSeq, len) ptr + peekElems (c_len :: CSizeT) (ptr `plusPtr` (#offset GuSeq, data)) + where + peekElems 0 ptr = return [] + peekElems len ptr = do + e <- peekElem ptr + es <- peekElems (len-1) (ptr `plusPtr` size) + return (e:es) + +newSequence :: CSizeT -> (Ptr a -> v -> IO ()) -> [v] -> Ptr GuPool -> IO (Ptr GuSeq) +newSequence elem_size pokeElem values pool = do + c_seq <- gu_make_seq elem_size (fromIntegral (length values)) pool + pokeElems (c_seq `plusPtr` (#offset GuSeq, data)) values + return c_seq + where + pokeElems ptr [] = return () + pokeElems ptr (x:xs) = do + pokeElem ptr x + pokeElems (ptr `plusPtr` (fromIntegral elem_size)) xs + ------------------------------------------------------------------ -- libpgf API @@ -431,6 +452,9 @@ foreign import ccall "pgf/expr.h pgf_expr_size" foreign import ccall "pgf/expr.h pgf_expr_functions" pgf_expr_functions :: PgfExpr -> Ptr GuPool -> IO (Ptr GuSeq) +foreign import ccall "pgf/expr.h pgf_expr_substitute" + pgf_expr_substitute :: PgfExpr -> Ptr GuSeq -> Ptr GuPool -> IO PgfExpr + foreign import ccall "pgf/expr.h pgf_compute_tree_probability" pgf_compute_tree_probability :: Ptr PgfPGF -> PgfExpr -> IO CFloat |
