packages feed

c14n-0.1.0.0: src/Text/XML/C14N/LibXML.hsc

--------------------------------------------------------------------------------
-- Haskell bindings for c14n implementation in libxml                         --
--------------------------------------------------------------------------------
-- This source code is licensed under the MIT license found in the LICENSE    --
-- file in the root directory of this source tree.                            --
--------------------------------------------------------------------------------

-- | Bindings to libxml types and functions required for the c14n 
-- implementation. See http://xmlsoft.org/html/libxml-c14n.html
module Text.XML.C14N.LibXML (
    -- * libxml2 types
    LibXMLDoc,
    LibXMLNodeSet,
    LibXMLChar,
    LibXMLXPathCtx,
    LibXMLXPathObj,

    -- * Memory-related functions
    freeXml,

    -- * Parsing
    -- See http://xmlsoft.org/html/libxml-parser.html
    xml_opt_recover, 
    xml_opt_noent,
    xml_opt_dtdload,
    xml_opt_dtdattr,
    xml_opt_dtdvalid,
    xml_opt_noerror,
    xml_opt_nowarning,
    xml_opt_pedantic,
    xml_opt_noblanks,
    xml_opt_sax1,
    xml_opt_xinclude,
    xml_opt_nonet,
    xml_opt_nodict,
    xml_opt_nsclean,
    xml_opt_nocdata,
    xml_opt_noxincnode,
    xml_opt_compact,
    xml_opt_old10,
    xml_opt_nobasefix,
    xml_opt_huge,
    xml_opt_oldsax,
    xml_opt_ignore_env,
    xml_opt_big_lines,
    xmlReadMemory,
    xmlFreeDoc,

    -- * XML canonicalisation
    -- See http://xmlsoft.org/html/libxml-c14n.html
    c14n_1_0,
    c14n_exclusive_1_0,
    c14n_1_1,
    xmlC14NDocDumpMemory,

    -- * XPath
    -- See http://xmlsoft.org/html/libxml-xpath.html
    xmlXPathNewContext,
    xmlXPathFreeContext,
    xmlXPathEval,
    xmlXPathFreeObject
) where 

--------------------------------------------------------------------------------

#include <libxml/parser.h>
#include <libxml/c14n.h>

import Data.Word

import Foreign.Ptr
import Foreign.C.String
import Foreign.C.Types

--------------------------------------------------------------------------------

-- | Original C14N 1.0 specification.
c14n_1_0 :: CInt 
c14n_1_0 = #{const XML_C14N_1_0}

-- | Exclusive C14N 1.0 specification.
c14n_exclusive_1_0 :: CInt 
c14n_exclusive_1_0 = #{const XML_C14N_EXCLUSIVE_1_0}

-- | C14N 1.1 specification.
c14n_1_1 :: CInt 
c14n_1_1 = #{const XML_C14N_1_1}

--------------------------------------------------------------------------------

-- | Recover on errors.
xml_opt_recover :: CInt 
xml_opt_recover = #{const XML_PARSE_RECOVER}

-- | Substitute entities.
xml_opt_noent :: CInt
xml_opt_noent = #{const XML_PARSE_NOENT}

-- | Load the external subset.
xml_opt_dtdload :: CInt 
xml_opt_dtdload = #{const XML_PARSE_DTDLOAD}

-- | Default DTD attributes.
xml_opt_dtdattr :: CInt 
xml_opt_dtdattr = #{const XML_PARSE_DTDATTR}

-- | Validate with the DTD.
xml_opt_dtdvalid :: CInt 
xml_opt_dtdvalid = #{const XML_PARSE_DTDVALID}

-- | Suppress error reports.
xml_opt_noerror :: CInt 
xml_opt_noerror = #{const XML_PARSE_NOERROR}

-- | Suppress warning reports.
xml_opt_nowarning :: CInt 
xml_opt_nowarning = #{const XML_PARSE_NOWARNING}

-- | Pedantic error reporting.
xml_opt_pedantic :: CInt 
xml_opt_pedantic = #{const XML_PARSE_PEDANTIC}

-- | Remove blank nodes.
xml_opt_noblanks :: CInt 
xml_opt_noblanks = #{const XML_PARSE_NOBLANKS}

-- | Use the SAX1 interface internally.
xml_opt_sax1 :: CInt 
xml_opt_sax1 = #{const XML_PARSE_SAX1}

-- | Implement XInclude substitution.
xml_opt_xinclude :: CInt 
xml_opt_xinclude = #{const XML_PARSE_XINCLUDE}

-- | Forbid network access.
xml_opt_nonet :: CInt
xml_opt_nonet = #{const XML_PARSE_NONET}

-- | Do not reuse the context dictionary.
xml_opt_nodict :: CInt
xml_opt_nodict = #{const XML_PARSE_NODICT}

-- | Remove redundant namespaces declarations.
xml_opt_nsclean :: CInt
xml_opt_nsclean = #{const XML_PARSE_NSCLEAN}

-- | Merge CDATA as text nodes.
xml_opt_nocdata :: CInt
xml_opt_nocdata = #{const XML_PARSE_NOCDATA}

-- | Do not generate XINCLUDE START/END nodes.
xml_opt_noxincnode :: CInt
xml_opt_noxincnode = #{const XML_PARSE_NOXINCNODE}

-- | Compact small text nodes; no modification of the tree allowed afterwards
-- (will probably crash if you try to modify the tree)
xml_opt_compact :: CInt
xml_opt_compact = #{const XML_PARSE_COMPACT}

-- | Parse using XML-1.0 before update 5.
xml_opt_old10 :: CInt
xml_opt_old10 = #{const XML_PARSE_OLD10}

-- | Do not fixup XINCLUDE xml:base uris.
xml_opt_nobasefix :: CInt
xml_opt_nobasefix = #{const XML_PARSE_NOBASEFIX}

-- | Relax any hardcoded limit from the parser.
xml_opt_huge :: CInt
xml_opt_huge = #{const XML_PARSE_HUGE}

-- | Parse using SAX2 interface before 2.7.0.
xml_opt_oldsax :: CInt
xml_opt_oldsax = #{const XML_PARSE_OLDSAX}

-- | Ignore internal document encoding hint.
xml_opt_ignore_env :: CInt
xml_opt_ignore_env = #{const XML_PARSE_IGNORE_ENC}

-- | Store big lines numbers in text PSVI field.
xml_opt_big_lines :: CInt
xml_opt_big_lines = #{const XML_PARSE_BIG_LINES}

--------------------------------------------------------------------------------

-- | XML documents
data LibXMLDoc 

-- | XML node sets
data LibXMLNodeSet

-- | XML strings
type LibXMLChar = #type xmlChar

-- | XML XPath contexts
data LibXMLXPathCtx

-- | XML XPath objects
data LibXMLXPathObj

-- | Free an XML object.
foreign import ccall unsafe "freeXml"
    freeXml :: Ptr a -> IO ()

-- | Free an XML document.
foreign import ccall unsafe "libxml/tree.h &xmlFreeDoc"
    xmlFreeDoc :: FunPtr ((Ptr LibXMLDoc) -> IO ())

-- | Parses an XML document from a textual representation held in memory.
foreign import ccall unsafe "libxml/parser.h xmlReadMemory"
    xmlReadMemory :: CString 
                  -> CInt 
                  -> CString 
                  -> CString 
                  -> CInt 
                  -> IO (Ptr LibXMLDoc)

-- | Writes the canonicalised representation of an XML document to memory.
foreign import ccall unsafe "libxml/c14n.h xmlC14NDocDumpMemory"
  xmlC14NDocDumpMemory :: Ptr LibXMLDoc -- ^ The XML document to canonicalise.
                       -> Ptr LibXMLNodeSet -- ^ The nodes set to be included
                                            -- in the canonicalised output.
                       -> CInt -- ^ The canonicalisation mode.
                       -> Ptr (Ptr LibXMLChar) -- ^ A list of inclusive 
                                               -- namespace prefixes
                       -> CInt -- ^ A boolean value indicating whether comments
                               -- should be included in the result or not.
                       -> Ptr (Ptr LibXMLChar) -- ^ A memory address to which
                                               -- the output should be written.
                       -> IO CInt

-- | Creates a new XPath context for the given document.
foreign import ccall unsafe "libxml/xpath.h xmlXPathNewContext"
    xmlXPathNewContext :: Ptr LibXMLDoc -> IO (Ptr LibXMLXPathCtx)

-- | Frees up an 'LibXMLXPathCtx' context.
foreign import ccall unsafe "libxml/xpath.h xmlXPathFreeContext"
    xmlXPathFreeContext :: Ptr LibXMLXPathCtx -> IO ()

-- | 'xmlXPathEval' @pathPtr ctxPtr@ evaluates the XPath location path
-- pointed at by @pathPtr@ in the XPath context pointed at by @ctxPtr@. 
foreign import ccall unsafe "libxml/xpath.h xmlXPathEval"
    xmlXPathEval :: Ptr LibXMLChar 
                 -> Ptr LibXMLXPathCtx 
                 -> IO (Ptr LibXMLXPathObj)

-- | Free up an 'LibXMLXPathObj' object.
foreign import ccall unsafe "libxml/xpath.h xmlXPathFreeObject"
    xmlXPathFreeObject :: Ptr LibXMLXPathObj -> IO ()

--------------------------------------------------------------------------------