summaryrefslogtreecommitdiff
path: root/src/runtime/haskell-bind/PGF2
diff options
context:
space:
mode:
authorKrasimir Angelov <kr.angelov@gmail.com>2017-09-28 16:33:34 +0200
committerKrasimir Angelov <kr.angelov@gmail.com>2017-09-28 16:33:34 +0200
commitf2bc7ec7b64973bd8147d4394a937d6c491a71fd (patch)
tree092e61c75bfc8cd9e80417527ef36742c98e37ae /src/runtime/haskell-bind/PGF2
parent1c04fa4897acfa2119fa32850bfcd6550b712da4 (diff)
added exprSubstitute in the C runtime for substituting meta variables
Diffstat (limited to 'src/runtime/haskell-bind/PGF2')
-rw-r--r--src/runtime/haskell-bind/PGF2/FFI.hsc26
-rw-r--r--src/runtime/haskell-bind/PGF2/Internal.hsc21
2 files changed, 25 insertions, 22 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
diff --git a/src/runtime/haskell-bind/PGF2/Internal.hsc b/src/runtime/haskell-bind/PGF2/Internal.hsc
index 259ea670d..c4aef323a 100644
--- a/src/runtime/haskell-bind/PGF2/Internal.hsc
+++ b/src/runtime/haskell-bind/PGF2/Internal.hsc
@@ -268,16 +268,6 @@ concrSequence c seqid = unsafePerformIO $ do
forms <- peekForms (len-1) (ptr `plusPtr` (#size PgfAlternative))
return ((form,prefixes):forms)
-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)
-
deRef peekValue ptr = peek ptr >>= peekValue
fidString, fidInt, fidFloat, fidVar, fidStart :: FId
@@ -901,17 +891,6 @@ pokeString pool c_elem str = do
c_str <- newUtf8CString str pool
poke c_elem c_str
-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
-
newMap key_size hasher newKey elem_size pokeElem values pool = do
map <- gu_make_map key_size hasher
elem_size gu_null_struct