[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