[Fencommits] fenfire-hs: add code for loading from URIs to Raptor.chs (untested, not beautiful)

Benja Fallenstein benja.fallenstein at gmail.com
Thu Feb 15 12:01:23 EET 2007


Thu Feb 15 12:00:45 EET 2007  Benja Fallenstein <benja.fallenstein at gmail.com>
  * add code for loading from URIs to Raptor.chs (untested, not beautiful)
diff -rN -u old-fenfire-hs/Raptor.chs new-fenfire-hs/Raptor.chs
--- old-fenfire-hs/Raptor.chs	2007-02-15 12:01:22.000000000 +0200
+++ new-fenfire-hs/Raptor.chs	2007-02-15 12:01:22.000000000 +0200
@@ -30,7 +30,7 @@
 import System.Environment (getArgs)
 
 import Control.Monad (when)
-import Data.IORef (modifyIORef, readIORef, newIORef)
+import Data.IORef (IORef, modifyIORef, readIORef, newIORef)
 import Control.Exception (bracket)
 
 #include <raptor.h>
@@ -137,6 +137,7 @@
 foreign import ccall "raptor.h raptor_new_uri" new_uri :: Ptr CChar -> IO (Ptr URI)
 foreign import ccall "raptor.h raptor_uri_copy" uri_copy :: Ptr URI -> IO (Ptr URI)
 foreign import ccall "raptor.h raptor_parse_file" parse_file :: Ptr Parser -> Ptr URI -> Ptr URI -> IO ()
+foreign import ccall "raptor.h raptor_parse_uri" parse_uri :: Ptr Parser -> Ptr URI -> Ptr URI -> IO ()
 
 foreign import ccall "raptor.h raptor_print_statement_as_ntriples" print_statement_as_ntriples :: Statement -> Ptr CFile -> IO ()
 
@@ -171,16 +172,49 @@
 -- | Parse a file with the given filename into triples
 --
 filenameToTriples :: String -> Maybe String -> IO [Triple]
-filenameToTriples filename baseURI = do 
-  result <- newIORef []
-
-  initRaptor
+filenameToTriples filename baseURI = do
   let suffix = reverse $ takeWhile (/= '.') $ reverse filename
       parsertype = case suffix of "turtle" -> "turtle"
                                   "ttl"    -> "turtle"
                                   "rdf"    -> "rdfxml"
                                   "nt"     -> "ntriples"
                                   _        -> "ntriples"
+
+  initRaptor
+
+  uri_str <- withCString filename uri_filename_to_uri_string
+  uri <- new_uri uri_str
+  base_uri <- maybe (uri_copy uri) (\s -> withCString s new_uri) baseURI
+
+  result <- parse parse_file parsertype uri base_uri
+
+  {# call free_uri #} uri
+  {# call free_uri #} base_uri
+  {# call free_memory #} (castPtr uri_str)
+  
+  {# call finish #}
+  readIORef result
+  
+uriToTriples :: String -> Maybe String -> IO [Triple]
+uriToTriples uri baseURI = do
+  initRaptor
+
+  uri' <- withCString uri new_uri
+  base_uri <- maybe (uri_copy uri') (\s -> withCString s new_uri) baseURI
+    
+  result <- parse parse_uri "guess" uri' base_uri
+
+  {# call free_uri #} uri'
+  {# call free_uri #} base_uri
+  
+  {# call finish #}
+  readIORef result
+
+parse :: (Ptr Parser -> Ptr URI -> Ptr URI -> IO ()) -> String ->
+         Ptr URI -> Ptr URI -> IO (IORef [Triple])
+parse fn parsertype uri base_uri = do
+  result <- newIORef []
+
   rdf_parser <- withCString parsertype new_parser 
   when (rdf_parser == nullPtr) $ fail "parser is null"
   handler <- mkHandler $ \_user_data triple -> do
@@ -190,19 +224,12 @@
     modifyIORef result ((s,p,o):)
 
   set_statement_handler rdf_parser nullPtr handler
-  uri_str <- withCString filename uri_filename_to_uri_string
-  uri <- new_uri uri_str
-  base_uri <- maybe (uri_copy uri) (\s -> withCString s new_uri) baseURI
-  parse_file rdf_parser uri base_uri
+  fn rdf_parser uri base_uri
 
   {# call free_parser #} (Parser rdf_parser)
   freeHaskellFunPtr handler
-  {# call free_uri #} uri
-  {# call free_uri #} base_uri
-  {# call free_memory #} (castPtr uri_str)
-
-  {# call finish #}
-  readIORef result
+  
+  return result
 
 -- The following print_triple and filenameToStdout are an incomplete and 
 -- improved translation of raptor examples/rdfprint.c:




More information about the Fencommits mailing list