[Fencommits] fenfire-hs: stringToTriples and triplesToString functions (untested)

Benja Fallenstein benja.fallenstein at gmail.com
Fri Mar 16 10:46:09 EET 2007


Fri Mar 16 10:45:50 EET 2007  Benja Fallenstein <benja.fallenstein at gmail.com>
  * stringToTriples and triplesToString functions (untested)
diff -rN -u old-fenfire-hs/Fenfire/Raptor.chs new-fenfire-hs/Fenfire/Raptor.chs
--- old-fenfire-hs/Fenfire/Raptor.chs	2007-03-16 10:46:08.000000000 +0200
+++ new-fenfire-hs/Fenfire/Raptor.chs	2007-03-16 10:46:08.000000000 +0200
@@ -1,6 +1,7 @@
 -- We want the C compiler to always check that types match:
 {-# OPTIONS_GHC -fvia-C #-}
 {-# OPTIONS_GHC -fffi -I. #-}
+{-# OPTIONS_GHC -fglasgow-exts #-}
 module Fenfire.Raptor where
 
 -- Copyright (c) 2006-2007, Benja Fallenstein, Tuukka Hastrup
@@ -21,10 +22,10 @@
 -- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 -- MA  02111-1307  USA
 
-import Foreign (Ptr, FunPtr, Storable(pokeByteOff, peekByteOff), allocaBytes,
-                nullPtr, castPtr, freeHaskellFunPtr)
+import Foreign (Ptr, FunPtr, IntPtr, Storable(pokeByteOff, peekByteOff), 
+                allocaBytes, nullPtr, castPtr, freeHaskellFunPtr, malloc, peek)
 import Foreign.C (CString, castCharToCChar, CFile,
-                  CSize, CInt, CUInt, CUChar, CChar)
+                  CSize, CInt, CUInt, CUChar, CChar, peekCStringLen)
 
 import System.Posix.IO (stdOutput)
 import System.Posix.Types (Fd)
@@ -34,7 +35,7 @@
 import Data.IORef (IORef, modifyIORef, readIORef, newIORef)
 import Control.Exception (bracket)
 
-import System.Glib.UTFString (withUTFString, peekUTFString)
+import System.Glib.UTFString (withUTFString, withUTFStringLen, peekUTFString)
 
 #include <raptor.h>
 
@@ -207,6 +208,50 @@
   {# call free_serializer #} serializer
   {# call finish #}
   
+-- | Serialize the given triples into memory
+--
+triplesToString :: [Triple] -> [(String, String)] -> String -> IO String
+triplesToString triples namespaces baseURI = do 
+  initRaptor
+
+  serializer <- withUTFString "turtle" {# call new_serializer #}
+  when (unSerializer serializer == nullPtr) $ fail "serializer is null"
+  
+  result_str :: Ptr (Ptr ()) <- malloc
+  result_len :: Ptr CUInt    <- malloc
+  
+  base_uri <- withUTFString baseURI new_uri
+
+  {# call serialize_start_to_string #} serializer base_uri result_str result_len
+  
+  flip mapM_ namespaces $ \(prefixS, uriS) -> do
+      withUTFString prefixS $ \prefixC -> withUTFString uriS $ \uriC -> do
+          uri <- new_uri uriC
+          {# call raptor_serialize_set_namespace #} serializer uri $ castPtr prefixC
+          {# call free_uri #} uri
+
+  allocaBytes {# sizeof statement #} $ \ptr -> do
+    let t = Statement ptr
+    flip mapM_ triples $ \(s,p,o) -> do
+      c_memset ptr 0 {# sizeof statement #}
+      withSubject t s $ withPredicate t p $ withObject t o $ do
+        {# call serialize_statement #} serializer t
+        return ()
+  {# call serialize_end #} serializer
+  {# call free_serializer #} serializer
+  
+  result_str' <- fmap castPtr $ peek result_str
+  result_len' <- fmap fromIntegral $ peek result_len
+  result <- peekCStringLen (result_str', result_len')
+
+  {# call free_uri #} base_uri
+  {# call free_memory #} (castPtr result_str')
+  {# call free_memory #} (castPtr result_str)
+  {# call free_memory #} (castPtr result_len)
+  {# call finish #}
+  
+  return result
+
 filenameToURI :: String -> IO String
 filenameToURI filename = do
   uri_str <- withUTFString filename uri_filename_to_uri_string
@@ -232,7 +277,7 @@
   uri <- new_uri uri_str
   base_uri <- maybe (uri_copy uri) (\s -> withUTFString s new_uri) baseURI
 
-  result <- parse {# call parse_file #} parsertype uri base_uri
+  result <- parse (\p -> {# call parse_file #} p uri base_uri) parsertype
 
   {# call free_uri #} uri
   {# call free_uri #} base_uri
@@ -248,17 +293,29 @@
   uri' <- withUTFString uri new_uri
   base_uri <- maybe (uri_copy uri') (\s -> withUTFString s new_uri) baseURI
     
-  result <- parse {# call parse_uri #} "guess" uri' base_uri
+  result <- parse (\p -> {# call parse_uri #} p uri' base_uri) "guess"
 
   {# call free_uri #} uri'
   {# call free_uri #} base_uri
   
   {# call finish #}
   return result
+  
+stringToTriples :: String -> String -> IO ([Triple], [(String, String)])
+stringToTriples str baseURI = do
+  initRaptor
+
+  base_uri <- withUTFString baseURI new_uri    
+  result <- withUTFStringLen str $ \(cstr, len) -> do
+      parse (\p -> {# call parse_chunk #} p (castPtr cstr) (fromIntegral len) 1) "guess"
+
+  {# call free_uri #} base_uri
+  
+  {# call finish #}
+  return result
 
-parse :: (Parser -> Ptr URI -> Ptr URI -> IO CInt) -> String ->
-         Ptr URI -> Ptr URI -> IO ([Triple], [(String, String)])
-parse fn parsertype uri base_uri = do
+parse :: (Parser -> IO CInt) -> String -> IO ([Triple], [(String, String)])
+parse fn parsertype = do
   triples <- newIORef []
   namespaces <- newIORef []
 
@@ -295,7 +352,7 @@
   {# call set_error_handler #} rdf_parser nullPtr errorHandler
   {# call set_warning_handler #} rdf_parser nullPtr warningHandler
 
-  fn rdf_parser uri base_uri
+  fn rdf_parser
 
   {# call free_parser #} rdf_parser
   freeHaskellFunPtr stHandler




More information about the Fencommits mailing list