packages feed

hexpat 0.14 → 0.15

raw patch · 10 files changed

+170/−216 lines, 10 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

- Text.XML.Expat.Annotated: alterAttribute :: (Eq tag, NodeClass n c, GenericXMLString tag) => tag -> Maybe text -> n c tag text -> n c tag text
- Text.XML.Expat.Annotated: deleteAttribute :: (Eq tag, NodeClass n c, GenericXMLString tag) => tag -> n c tag text -> n c tag text
- Text.XML.Expat.Annotated: getAttribute :: (NodeClass n c, GenericXMLString tag) => n c tag text -> tag -> Maybe text
- Text.XML.Expat.Annotated: getAttributes :: (NodeClass n c) => n c tag text -> [(tag, text)]
- Text.XML.Expat.Annotated: getChildren :: (NodeClass n c) => n c tag text -> c (n c tag text)
- Text.XML.Expat.Annotated: getName :: (NodeClass n c, Monoid tag) => n c tag text -> tag
- Text.XML.Expat.Annotated: isElement :: (NodeClass n c) => n c tag text -> Bool
- Text.XML.Expat.Annotated: isNamed :: (NodeClass n c, Eq tag) => tag -> n c tag text -> Bool
- Text.XML.Expat.Annotated: isText :: (NodeClass n c) => n c tag text -> Bool
- Text.XML.Expat.Annotated: mapAllTags :: (NodeClass n c) => (tag -> tag') -> n c tag text -> n c tag' text
- Text.XML.Expat.Annotated: modifyAttributes :: (NodeClass n c) => ([(tag, text)] -> [(tag, text)]) -> n c tag text -> n c tag text
- Text.XML.Expat.Annotated: modifyChildren :: (NodeClass n c) => (c (n c tag text) -> c (n c tag text)) -> n c tag text -> n c tag text
- Text.XML.Expat.Annotated: modifyName :: (NodeClass n c) => (tag -> tag) -> n c tag text -> n c tag text
- Text.XML.Expat.Annotated: setAttribute :: (Eq tag, NodeClass n c, GenericXMLString tag) => tag -> text -> n c tag text -> n c tag text
- Text.XML.Expat.Annotated: textContent :: (NodeClass n [], Monoid text) => n [] tag text -> text
- Text.XML.Expat.Annotated: type Attributes tag text = [(tag, text)]
- Text.XML.Expat.Annotated: type UAttributes text = Attributes text text
- Text.XML.Expat.IO: unsafeParseChunk :: Parser -> ByteString -> Bool -> IO (Maybe XMLParseError)
- Text.XML.Expat.IO: unsafeReleaseHandlers :: ExpatHandlers -> IO ()
- Text.XML.Expat.IO: unsafeSetHandlers :: Parser -> IO ExpatHandlers
- Text.XML.Expat.IO: withHandlers :: Parser -> IO a -> IO a
- Text.XML.Expat.Tree: alterAttribute :: (Eq tag, NodeClass n c, GenericXMLString tag) => tag -> Maybe text -> n c tag text -> n c tag text
- Text.XML.Expat.Tree: deleteAttribute :: (Eq tag, NodeClass n c, GenericXMLString tag) => tag -> n c tag text -> n c tag text
- Text.XML.Expat.Tree: getAttribute :: (NodeClass n c, GenericXMLString tag) => n c tag text -> tag -> Maybe text
- Text.XML.Expat.Tree: getAttributes :: (NodeClass n c) => n c tag text -> [(tag, text)]
- Text.XML.Expat.Tree: getChildren :: (NodeClass n c) => n c tag text -> c (n c tag text)
- Text.XML.Expat.Tree: getName :: (NodeClass n c, Monoid tag) => n c tag text -> tag
- Text.XML.Expat.Tree: isElement :: (NodeClass n c) => n c tag text -> Bool
- Text.XML.Expat.Tree: isNamed :: (NodeClass n c, Eq tag) => tag -> n c tag text -> Bool
- Text.XML.Expat.Tree: isText :: (NodeClass n c) => n c tag text -> Bool
- Text.XML.Expat.Tree: mapAllTags :: (NodeClass n c) => (tag -> tag') -> n c tag text -> n c tag' text
- Text.XML.Expat.Tree: modifyAttributes :: (NodeClass n c) => ([(tag, text)] -> [(tag, text)]) -> n c tag text -> n c tag text
- Text.XML.Expat.Tree: modifyChildren :: (NodeClass n c) => (c (n c tag text) -> c (n c tag text)) -> n c tag text -> n c tag text
- Text.XML.Expat.Tree: modifyName :: (NodeClass n c) => (tag -> tag) -> n c tag text -> n c tag text
- Text.XML.Expat.Tree: setAttribute :: (Eq tag, NodeClass n c, GenericXMLString tag) => tag -> text -> n c tag text -> n c tag text
- Text.XML.Expat.Tree: textContent :: (NodeClass n [], Monoid text) => n [] tag text -> text
- Text.XML.Expat.Tree: type Attributes tag text = [(tag, text)]
- Text.XML.Expat.Tree: type UAttributes text = Attributes text text
+ Text.XML.Expat.IO: data Parser_struct
+ Text.XML.Expat.IO: type ParserPtr = Ptr Parser_struct
+ Text.XML.Expat.IO: withParser :: Parser -> (ParserPtr -> IO a) -> IO a
- Text.XML.Expat.IO: getParseLocation :: Parser -> IO XMLParseLocation
+ Text.XML.Expat.IO: getParseLocation :: ParserPtr -> IO XMLParseLocation
- Text.XML.Expat.IO: parseChunk :: Parser -> ByteString -> Bool -> IO (Maybe XMLParseError)
+ Text.XML.Expat.IO: parseChunk :: ParserPtr -> ByteString -> Bool -> IO (Maybe XMLParseError)
- Text.XML.Expat.IO: type CharacterDataHandler = CStringLen -> IO Bool
+ Text.XML.Expat.IO: type CharacterDataHandler = ParserPtr -> CStringLen -> IO Bool
- Text.XML.Expat.IO: type EndElementHandler = CString -> IO Bool
+ Text.XML.Expat.IO: type EndElementHandler = ParserPtr -> CString -> IO Bool
- Text.XML.Expat.IO: type SkippedEntityHandler = CString -> Int -> IO Bool
+ Text.XML.Expat.IO: type SkippedEntityHandler = ParserPtr -> CString -> Int -> IO Bool
- Text.XML.Expat.IO: type StartElementHandler = CString -> [(CString, CString)] -> IO Bool
+ Text.XML.Expat.IO: type StartElementHandler = ParserPtr -> CString -> [(CString, CString)] -> IO Bool

Files

Text/XML/Expat/Annotated.hs view
@@ -9,26 +9,12 @@   -- * Tree structure   Node,   NodeG(..),-  Attributes,  -- re-export from NodeClass   UNode,-  UAttributes, -- re-export from NodeClass   LNode,   ULNode,-  textContent,-  isElement,-  isNamed,-  isText,-  getName,-  getAttributes,-  getAttribute,-  getChildren,-  modifyName,-  modifyAttributes,-  setAttribute,-  deleteAttribute,-  alterAttribute,-  modifyChildren,-  mapAllTags,++  -- * Generic node manipulation+  module Text.XML.Expat.NodeClass,    -- * Annotation-specific   unannotate,
Text/XML/Expat/Cursor.hs view
@@ -93,7 +93,6 @@   ) where  import Text.XML.Expat.Tree-import Text.XML.Expat.NodeClass import Data.Maybe(isNothing) import Data.Monoid import Control.Monad.Identity
Text/XML/Expat/Format.hs view
@@ -115,19 +115,7 @@     | otherwise = mzero   where     singleton = return--concatL :: List l => l (l a) -> l a-concatL l1 = joinL $ do-    li1 <- runList l1-    return $ case li1 of-        Nil -> mzero-        Cons l2 l1' ->-            let concat2L l2 = joinL $ do-                    li2 <- runList l2-                    return $ case li2 of-                        Nil -> concatL l1'-                        Cons elt l2' -> cons elt $ concat2L l2'-            in  concat2L l2+    concatL = join  -- | Format SAX events with no header - lazy variant that returns lazy ByteString. formatSAX :: (GenericXMLString tag, GenericXMLString text) =>
Text/XML/Expat/IO.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE ForeignFunctionInterface #-}+{-# LANGUAGE ForeignFunctionInterface, EmptyDataDecls #-}  -- hexpat, a Haskell wrapper for expat -- Copyright (C) 2008 Evan Martin <martine@danga.com>@@ -12,14 +12,20 @@ -- -- (2) Set up callbacks on the parser: 'setStartElementHandler', etc. ----- (3) Feed data into the parser: 'parse', 'parse'' or 'parseChunk'.+-- (3) Feed data into the parser: 'parse', 'parse'' or 'parseChunk'.  Some of+--     these functions must be wrapped in 'withParser'.  module Text.XML.Expat.IO (   -- ** Parser Setup   Parser, newParser,    -- ** Parsing-  parse, parse', parseChunk, Encoding(..), XMLParseError(..),+  parse, parse',+  withParser,+  ParserPtr, Parser_struct,+  parseChunk,+  Encoding(..),+  XMLParseError(..),   getParseLocation,   XMLParseLocation(..), @@ -38,10 +44,6 @@    -- ** Lower-level interface   parseExternalEntityReference,-  unsafeParseChunk,-  withHandlers,-  unsafeSetHandlers,-  unsafeReleaseHandlers,   ExpatHandlers,    -- ** Helpers@@ -59,9 +61,10 @@   -- |Opaque parser type.-type ParserPtr = Ptr ()+data Parser_struct+type ParserPtr = Ptr Parser_struct data Parser = Parser-    { _parserObj                :: ForeignPtr ()+    { _parserObj                :: ForeignPtr Parser_struct     , _startElementHandler      :: IORef CStartElementHandler     , _endElementHandler        :: IORef CEndElementHandler     , _cdataHandler             :: IORef CCharacterDataHandler@@ -72,9 +75,6 @@ instance Show Parser where     showsPrec _ (Parser fp _ _ _ _ _) = showsPrec 0 fp -withParser :: Parser -> (ParserPtr -> IO a) -> IO a-withParser (Parser fp _ _ _ _ _) = withForeignPtr fp- -- |Encoding types available for the document encoding. data Encoding = ASCII | UTF8 | UTF16 | ISO88591 encodingToString :: Encoding -> String@@ -90,10 +90,10 @@  parserCreate :: Maybe Encoding -> IO (ParserPtr) parserCreate a1 =-  withOptEncoding a1 $ \a1' ->-  parserCreate'_ a1' >>= \res ->-  let {res' = id res} in-  return (res')+  withOptEncoding a1 $ \a1' -> do+      pp <- parserCreate'_ a1'+      xmlSetUserData pp pp+      return pp  -- | Create a 'Parser'. newParser :: Maybe Encoding -> IO Parser@@ -106,7 +106,6 @@   extH       <- newIORef Nothing   skipH      <- newIORef Nothing -   return $ Parser fptr nullStartH nullEndH nullCharH extH skipH  setUseForeignDTD :: Parser -> Bool -> IO ()@@ -127,36 +126,27 @@ -- |@parse data@ feeds /lazy/ ByteString data into a 'Parser'. It returns -- Nothing on success, or Just the parse error. parse :: Parser -> BSL.ByteString -> IO (Maybe XMLParseError)-parse parser bs = withHandlers parser $ do+parse parser bs = withParser parser $ \pp -> do+    let+        doParseChunks [] = doParseChunk pp BS.empty True+        doParseChunks (c:cs) = do+            ok <- doParseChunk pp c False+            if ok+                then doParseChunks cs+                else return False     ok <- doParseChunks (BSL.toChunks bs)     if ok         then return Nothing-        else Just `fmap` getError parser-  where-    doParseChunks [] = doParseChunk parser BS.empty True-    doParseChunks (c:cs) = do-        ok <- doParseChunk parser c False-        if ok-            then doParseChunks cs-            else return False+        else Just `fmap` getError pp  -- |@parse data@ feeds /strict/ ByteString data into a 'Parser'. It returns -- Nothing on success, or Just the parse error. parse' :: Parser -> BS.ByteString -> IO (Maybe XMLParseError)-parse' parser bs = withHandlers parser $ do-    ok <- doParseChunk parser bs True+parse' parser bs = withParser parser $ \pp -> do+    ok <- doParseChunk pp bs True     if ok         then return Nothing-        else Just `fmap` getError parser---- |@parseChunk data False@ feeds /strict/ ByteString data into a--- 'Parser'.  The end of the data is indicated by passing @True@ for the--- final parameter.   It returns Nothing on success, or Just the parse error.-parseChunk :: Parser-           -> BS.ByteString-           -> Bool  -- ^ True if last chunk-           -> IO (Maybe XMLParseError)-parseChunk parser xml final = withHandlers parser $ unsafeParseChunk parser xml final+        else Just `fmap` getError pp  parseExternalEntityReference :: Parser                              -> CString         -- ^ context@@ -164,33 +154,32 @@                              -> CStringLen      -- ^ text                              -> IO Bool parseExternalEntityReference parser context encoding (text,sz) =-    withParser parser $ \p -> do+    withParser parser $ \pp -> do         extp <- withOptEncoding encoding $-                xmlExternalEntityParserCreate p context+                xmlExternalEntityParserCreate pp context         e <- doParseChunk'_ extp text (fromIntegral sz) 1         parserFree' extp         return $ e == 1 --- | This variant of 'parseChunk' must either be called inside 'withHandlers'--- (safest), or between 'unsafeSetHandlers' and 'unsafeReleaseHandlers', and--- this will give you better performance than 'parseChunk' if you process--- multiple chunks inside.-unsafeParseChunk :: Parser+-- |@parseChunk data False@ feeds /strict/ ByteString data into a+-- 'Parser'.  The end of the data is indicated by passing @True@ for the+-- final parameter.   It returns Nothing on success, or Just the parse error.+parseChunk :: ParserPtr            -> BS.ByteString            -> Bool            -> IO (Maybe XMLParseError)-unsafeParseChunk parser xml final = do-    ok <- doParseChunk parser xml final+parseChunk pp xml final = do+    ok <- doParseChunk pp xml final     if ok         then return Nothing-        else Just `fmap` getError parser+        else Just `fmap` getError pp -getError :: Parser -> IO XMLParseError-getError parser = withParser parser $ \p -> do-    code <- xmlGetErrorCode p+getError :: ParserPtr -> IO XMLParseError+getError pp = do+    code <- xmlGetErrorCode pp     cerr <- xmlErrorString code     err <- peekCString cerr-    loc <- getParseLocation parser+    loc <- getParseLocation pp     return $ XMLParseError err loc  data ExpatHandlers = ExpatHandlers@@ -200,63 +189,62 @@     (Maybe (FunPtr CExternalEntityRefHandler))     (Maybe (FunPtr CSkippedEntityHandler)) -unsafeSetHandlers :: Parser -> IO ExpatHandlers-unsafeSetHandlers parser@(Parser _ startRef endRef charRef extRef skipRef) =-  do-    cStartH <- mkCStartElementHandler =<< readIORef startRef-    cEndH   <- mkCEndElementHandler =<< readIORef endRef-    cCharH  <- mkCCharacterDataHandler =<< readIORef charRef-    mExtH   <- readIORef extRef >>=-                   maybe (return Nothing)-                         (\h -> liftM Just $ mkCExternalEntityRefHandler h)--    mSkipH  <- readIORef skipRef >>=-                   maybe (return Nothing)-                         (\h -> liftM Just $ mkCSkippedEntityHandler h)--    withParser parser $ \p -> do-        xmlSetstartelementhandler  p cStartH-        xmlSetendelementhandler    p cEndH-        xmlSetcharacterdatahandler p cCharH+-- | Most of the low-level functions take a ParserPtr so are required to be+-- called inside @withParser@.+withParser :: Parser+           -> (ParserPtr -> IO a)  -- ^ Computation where parseChunk and other low-level functions may be used+           -> IO a+withParser parser@(Parser fp _ _ _ _ _) code = withForeignPtr fp $ \pp -> do+    bracket+        (unsafeSetHandlers parser pp)+        unsafeReleaseHandlers+        (\_ -> code pp)+  where+    unsafeSetHandlers :: Parser -> ParserPtr -> IO ExpatHandlers+    unsafeSetHandlers (Parser _ startRef endRef charRef extRef skipRef) pp =+      do+        cStartH <- mkCStartElementHandler =<< readIORef startRef+        cEndH   <- mkCEndElementHandler =<< readIORef endRef+        cCharH  <- mkCCharacterDataHandler =<< readIORef charRef+        mExtH   <- readIORef extRef >>=+                       maybe (return Nothing)+                             (\h -> liftM Just $ mkCExternalEntityRefHandler h)+    +        mSkipH  <- readIORef skipRef >>=+                       maybe (return Nothing)+                             (\h -> liftM Just $ mkCSkippedEntityHandler h)+    +        xmlSetstartelementhandler  pp cStartH+        xmlSetendelementhandler    pp cEndH+        xmlSetcharacterdatahandler pp cCharH         maybe (return ())-              (xmlSetExternalEntityRefHandler p)+              (xmlSetExternalEntityRefHandler pp)               mExtH         maybe (return ())-              (xmlSetSkippedEntityHandler p)+              (xmlSetSkippedEntityHandler pp)               mSkipH+    +        return $ ExpatHandlers cStartH cEndH cCharH mExtH mSkipH+    +    unsafeReleaseHandlers :: ExpatHandlers -> IO ()+    unsafeReleaseHandlers (ExpatHandlers cStartH cEndH cCharH mcExtH mcSkipH) = do+        freeHaskellFunPtr cStartH+        freeHaskellFunPtr cEndH+        freeHaskellFunPtr cCharH+        maybe (return ()) freeHaskellFunPtr mcExtH+        maybe (return ()) freeHaskellFunPtr mcSkipH -    return $ ExpatHandlers cStartH cEndH cCharH mExtH mSkipH -unsafeReleaseHandlers :: ExpatHandlers -> IO ()-unsafeReleaseHandlers (ExpatHandlers cStartH cEndH cCharH mcExtH mcSkipH) = do-    freeHaskellFunPtr cStartH-    freeHaskellFunPtr cEndH-    freeHaskellFunPtr cCharH-    maybe (return ()) freeHaskellFunPtr mcExtH-    maybe (return ()) freeHaskellFunPtr mcSkipH---- | 'unsafeParseChunk' is required to be called inside @withHandlers@.--- Safer than using 'unsafeSetHandlers' / 'unsafeReleaseHandlers'.-withHandlers :: Parser-             -> IO a  -- ^ Computation where unsafeParseChunk may be used-             -> IO a-withHandlers parser code = do-    bracket-        (unsafeSetHandlers parser)-        unsafeReleaseHandlers-        (\_ -> code)- -- |Obtain C value from Haskell 'Bool'. -- cFromBool :: Num a => Bool -> a cFromBool  = fromBool -doParseChunk :: Parser -> BS.ByteString -> Bool -> IO (Bool)+doParseChunk :: ParserPtr -> BS.ByteString -> Bool -> IO (Bool) doParseChunk a1 a2 a3 =-  withParser a1 $ \a1' ->   withBStringLen a2 $ \(a2'1, a2'2) ->   let {a3' = cFromBool a3} in-  doParseChunk'_ a1' a2'1  a2'2 a3' >>= \res ->+  doParseChunk'_ a1 a2'1  a2'2 a3' >>= \res ->   let {res' = unStatus res} in   return (res') @@ -278,12 +266,12 @@ instance NFData XMLParseLocation where     rnf (XMLParseLocation lin col ind cou) = rnf (lin, col, ind, cou) -getParseLocation :: Parser -> IO XMLParseLocation-getParseLocation parser = withParser parser $ \p -> do-    line <- xmlGetCurrentLineNumber p-    col <- xmlGetCurrentColumnNumber p-    index <- xmlGetCurrentByteIndex p-    count <- xmlGetCurrentByteCount p+getParseLocation :: ParserPtr -> IO XMLParseLocation+getParseLocation pp = do+    line <- xmlGetCurrentLineNumber pp+    col <- xmlGetCurrentColumnNumber pp+    index <- xmlGetCurrentByteIndex pp+    count <- xmlGetCurrentByteCount pp     return $ XMLParseLocation {             xmlLineNumber = fromIntegral line,             xmlColumnNumber = fromIntegral col,@@ -294,18 +282,18 @@ -- | The type of the \"element started\" callback.  The first parameter is the -- element name; the second are the (attribute, value) pairs. Return True to -- continue parsing as normal, or False to terminate the parse.-type StartElementHandler  = CString -> [(CString, CString)] -> IO Bool+type StartElementHandler  = ParserPtr -> CString -> [(CString, CString)] -> IO Bool  -- | The type of the \"element ended\" callback.  The parameter is the element -- name. Return True to continue parsing as normal, or False to terminate the -- parse.-type EndElementHandler    = CString -> IO Bool+type EndElementHandler    = ParserPtr -> CString -> IO Bool  -- | The type of the \"character data\" callback.  The parameter is the -- character data processed.  This callback may be called more than once while -- processing a single conceptual block of text. Return True to continue -- parsing as normal, or False to terminate the parse.-type CharacterDataHandler = CStringLen -> IO Bool+type CharacterDataHandler = ParserPtr -> CStringLen -> IO Bool  -- | The type of the \"external entity reference\" callback. See the expat -- documentation.@@ -323,11 +311,12 @@ -- -- 2. An internal entity reference is read, but not expanded, because -- @XML_SetDefaultHandler@ has been called.-type SkippedEntityHandler =  CString  -- entityName-                          -> Int      -- is a parameter entity?+type SkippedEntityHandler =  ParserPtr+                          -> CString   -- entityName+                          -> Int       -- is a parameter entity?                           -> IO Bool -type CStartElementHandler = Ptr () -> CString -> Ptr CString -> IO ()+type CStartElementHandler = ParserPtr -> CString -> Ptr CString -> IO ()  nullCStartElementHandler :: CStartElementHandler nullCStartElementHandler _ _ _ = return ()@@ -339,17 +328,17 @@ wrapStartElementHandler :: Parser -> StartElementHandler -> CStartElementHandler wrapStartElementHandler parser handler = h   where-    h _ cname cattrs = do+    h pp cname cattrs = do         cattrlist <- peekArray0 nullPtr cattrs-        stillRunning <- handler cname (pairwise cattrlist)-        unless stillRunning $ stopParser parser+        stillRunning <- handler pp cname (pairwise cattrlist)+        unless stillRunning $ stopp parser  -- | Attach a StartElementHandler to a Parser. setStartElementHandler :: Parser -> StartElementHandler -> IO () setStartElementHandler parser@(Parser _ startRef _ _ _ _) handler =     writeIORef startRef $ wrapStartElementHandler parser handler -type CEndElementHandler = Ptr () -> CString -> IO ()+type CEndElementHandler = ParserPtr -> CString -> IO ()  nullCEndElementHandler :: CEndElementHandler nullCEndElementHandler _ _ = return ()@@ -360,16 +349,16 @@ wrapEndElementHandler :: Parser -> EndElementHandler -> CEndElementHandler wrapEndElementHandler parser handler = h   where-    h _ cname = do-        stillRunning <- handler cname-        unless stillRunning $ stopParser parser+    h pp cname = do+        stillRunning <- handler pp cname+        unless stillRunning $ stopp parser  -- | Attach an EndElementHandler to a Parser. setEndElementHandler :: Parser -> EndElementHandler -> IO () setEndElementHandler parser@(Parser _ _ endRef _ _ _) handler =     writeIORef endRef $ wrapEndElementHandler parser handler -type CCharacterDataHandler = Ptr () -> CString -> CInt -> IO ()+type CCharacterDataHandler = ParserPtr -> CString -> CInt -> IO ()  nullCCharacterDataHandler :: CCharacterDataHandler nullCCharacterDataHandler _ _ _ = return ()@@ -380,9 +369,9 @@ wrapCharacterDataHandler :: Parser -> CharacterDataHandler -> CCharacterDataHandler wrapCharacterDataHandler parser handler = h   where-    h _ cdata len = do-        stillRunning <- handler (cdata, fromIntegral len)-        unless stillRunning $ stopParser parser+    h pp cdata len = do+        stillRunning <- handler pp (cdata, fromIntegral len)+        unless stillRunning $ stopp parser  -- | Attach an CharacterDataHandler to a Parser. setCharacterDataHandler :: Parser -> CharacterDataHandler -> IO ()@@ -393,26 +382,29 @@ pairwise (x1:x2:xs) = (x1,x2) : pairwise xs pairwise _          = [] -stopParser :: Parser -> IO ()-stopParser parser = withParser parser $ \p -> xmlStopParser p 0+stopp :: Parser -> IO ()+stopp parser = withParser parser $ \p -> xmlStopParser p 0  ------------------------------------------------------------------------------ -- C imports  foreign import ccall unsafe "XML_ParserCreate"-  parserCreate'_ :: ((Ptr CChar) -> (IO (Ptr ())))+  parserCreate'_ :: Ptr CChar -> IO ParserPtr+  +foreign import ccall unsafe "XML_SetUserData"+  xmlSetUserData :: ParserPtr -> ParserPtr -> IO ()  foreign import ccall unsafe "XML_SetStartElementHandler"-  xmlSetstartelementhandler :: ((Ptr ()) -> ((FunPtr ((Ptr ()) -> ((Ptr CChar) -> ((Ptr (Ptr CChar)) -> (IO ()))))) -> (IO ())))+  xmlSetstartelementhandler :: ParserPtr -> ((FunPtr (ParserPtr -> ((Ptr CChar) -> ((Ptr (Ptr CChar)) -> (IO ())))) -> (IO ())))  foreign import ccall unsafe "XML_SetEndElementHandler"-  xmlSetendelementhandler :: ((Ptr ()) -> ((FunPtr ((Ptr ()) -> ((Ptr CChar) -> (IO ())))) -> (IO ())))+  xmlSetendelementhandler :: ParserPtr -> ((FunPtr (ParserPtr -> ((Ptr CChar) -> (IO ()))) -> (IO ())))  foreign import ccall unsafe "XML_SetCharacterDataHandler"-  xmlSetcharacterdatahandler :: ((Ptr ()) -> ((FunPtr ((Ptr ()) -> ((Ptr CChar) -> (CInt -> (IO ()))))) -> (IO ())))+  xmlSetcharacterdatahandler :: ParserPtr -> ((FunPtr (ParserPtr -> ((Ptr CChar) -> (CInt -> (IO ())))) -> (IO ())))  foreign import ccall safe "XML_Parse"-  doParseChunk'_ :: ((Ptr ()) -> ((Ptr CChar) -> (CInt -> (CInt -> (IO CInt)))))+  doParseChunk'_ :: ParserPtr -> ((Ptr CChar) -> (CInt -> (CInt -> (IO CInt))))  foreign import ccall unsafe "XML_UseForeignDTD"   xmlUseForeignDTD :: ParserPtr     -- ^ parser@@ -452,9 +444,9 @@                                 -> CString   -- ^ encoding                                 -> IO ParserPtr -type CSkippedEntityHandler =  Ptr ()   -- user data pointer-                           -> CString  -- entity name-                           -> CInt     -- is a parameter entity?+type CSkippedEntityHandler =  ParserPtr -- user data pointer+                           -> CString   -- entity name+                           -> CInt      -- is a parameter entity?                            -> IO ()  foreign import ccall safe "wrapper"@@ -469,7 +461,7 @@   where     h _ context base systemID publicID = do         stillRunning <- handler parser context base systemID publicID-        unless stillRunning $ stopParser parser+        unless stillRunning $ stopp parser   wrapSkippedEntityHandler :: Parser@@ -477,9 +469,9 @@                          -> CSkippedEntityHandler wrapSkippedEntityHandler parser handler = h   where-    h _ entityName i = do-        stillRunning <- handler entityName (fromIntegral i)-        unless stillRunning $ stopParser parser+    h pp entityName i = do+        stillRunning <- handler pp entityName (fromIntegral i)+        unless stillRunning $ stopp parser   setExternalEntityRefHandler :: Parser -> ExternalEntityRefHandler -> IO ()
Text/XML/Expat/Namespaced.hs view
@@ -13,7 +13,6 @@       ) where  import Text.XML.Expat.Tree-import Text.XML.Expat.NodeClass import Text.XML.Expat.Qualified import Control.Parallel.Strategies import qualified Data.Map as M
Text/XML/Expat/Qualified.hs view
@@ -20,7 +20,7 @@         fromQualified     ) where -import Text.XML.Expat.NodeClass+import Text.XML.Expat.NodeClass () import Text.XML.Expat.Tree import Control.Parallel.Strategies import Data.Monoid
Text/XML/Expat/SAX.hs view
@@ -157,8 +157,8 @@     setSkippedEntityHandler parser skip    where-    skip _ 1 = return False-    skip entityName 0 = do+    skip _ _ 1 = return False+    skip _ entityName 0 = do         en <- textFromCString entityName         let mbt = decoder en         maybe (return False)@@ -166,7 +166,7 @@                    modifyIORef queueRef (CharacterData t:)                    return True)               mbt-    skip _ _ = undefined+    skip _ _ _ = undefined      eh p ctx _ systemID publicID =         if systemID == nullPtr && publicID == nullPtr@@ -186,17 +186,17 @@     setSkippedEntityHandler parser skip    where-    skip _ 1 = return False-    skip entityName 0 = do+    skip _ _ 1 = return False+    skip pp entityName 0 = do         en <- textFromCString entityName         let mbt = decoder en         maybe (return False)               (\t -> do-                   loc <- getParseLocation parser+                   loc <- getParseLocation pp                    modifyIORef queueRef ((CharacterData t,loc):)                    return True)               mbt-    skip _ _ = undefined+    skip _ _ _ = undefined      eh p ctx _ systemID publicID =         if systemID == nullPtr && publicID == nullPtr@@ -222,7 +222,7 @@           (setEntityDecoder parser queueRef)           mEntityDecoder -    setStartElementHandler parser $ \cName cAttrs -> do+    setStartElementHandler parser $ \_ cName cAttrs -> do         name <- textFromCString cName         attrs <- forM cAttrs $ \(cAttrName,cAttrValue) -> do             attrName <- textFromCString cAttrName@@ -231,25 +231,25 @@         modifyIORef queueRef (StartElement name attrs:)         return True -    setEndElementHandler parser $ \cName -> do+    setEndElementHandler parser $ \_ cName -> do         name <- textFromCString cName         modifyIORef queueRef (EndElement name:)         return True -    setCharacterDataHandler parser $ \cText -> do+    setCharacterDataHandler parser $ \_ cText -> do         txt <- gxFromCStringLen cText         modifyIORef queueRef (CharacterData txt:)         return True      let runParser inp = unsafeInterleaveIO $ do-            rema <- case inp of+            rema <- withParser parser $ \pp -> case inp of                 (c:cs) -> do-                    mError <- parseChunk parser c False+                    mError <- parseChunk pp c False                     case mError of                         Just err -> return [FailDocument err]                         Nothing -> runParser cs                 [] -> do-                    mError <- parseChunk parser B.empty True+                    mError <- parseChunk pp B.empty True                     case mError of                         Just err -> return [FailDocument err]                         Nothing -> return []@@ -297,38 +297,39 @@           (setEntityDecoderLoc parser queueRef)           mEntityDecoder -    setStartElementHandler parser $ \cName cAttrs -> do+    setStartElementHandler parser $ \pp cName cAttrs -> do         name <- textFromCString cName         attrs <- forM cAttrs $ \(cAttrName,cAttrValue) -> do             attrName <- textFromCString cAttrName             attrValue <- textFromCString cAttrValue             return (attrName, attrValue)-        loc <- getParseLocation parser+        loc <- getParseLocation pp         modifyIORef queueRef ((StartElement name attrs,loc):)         return True -    setEndElementHandler parser $ \cName -> do+    setEndElementHandler parser $ \pp cName -> do         name <- textFromCString cName-        loc <- getParseLocation parser+        loc <- getParseLocation pp         modifyIORef queueRef ((EndElement name, loc):)         return True -    setCharacterDataHandler parser $ \cText -> do+    setCharacterDataHandler parser $ \pp cText -> do         txt <- gxFromCStringLen cText-        loc <- getParseLocation parser+        loc <- getParseLocation pp         modifyIORef queueRef ((CharacterData txt, loc):)         return True      let runParser [] = return []         runParser (c:cs) = unsafeInterleaveIO $ do-            mError <- parseChunk parser c (null cs)             queue <- readIORef queueRef             writeIORef queueRef []-            rema <- case mError of-                Just err -> do-                    loc <- getParseLocation parser-                    return [(FailDocument err, loc)]-                Nothing -> runParser cs+            rema <- withParser parser $ \pp -> do+                mError <- parseChunk pp c (null cs)+                case mError of+                    Just err -> do+                        loc <- getParseLocation pp+                        return [(FailDocument err, loc)]+                    Nothing -> runParser cs             return $ reverse queue ++ rema      runParser $ L.toChunks input
Text/XML/Expat/Tree.hs view
@@ -96,25 +96,11 @@   -- * Tree structure   Node,   NodeG(..),-  Attributes,   UNode,-  UAttributes,-  textContent,-  isElement,-  isNamed,-  isText,-  getName,-  getAttributes,-  getAttribute,-  getChildren,-  modifyName,-  modifyAttributes,-  setAttribute,-  deleteAttribute,-  alterAttribute,-  modifyChildren,-  mapAllTags, +  -- * Generic node manipulation+  module Text.XML.Expat.NodeClass,+   -- * Parse to tree   ParserOptions(..),   defaultParserOptions,@@ -302,8 +288,8 @@     text str (cur:rest) = modifyChildren (Text str:) cur : rest     text _ [] = undefined -    skip _ 1 = return False-    skip entityName 0 = do+    skip _ _ 1 = return False+    skip _ entityName 0 = do         en <- textFromCString entityName         let mbt = decoder en         maybe (return False)@@ -311,7 +297,7 @@                    modifyIORef queueRef $ text t                    return True)               mbt-    skip _ _ = undefined+    skip _ _ _ = undefined      eh p ctx _ systemID publicID =         if systemID == nullPtr && publicID == nullPtr@@ -341,7 +327,7 @@           (setEntityDecoder parser stack)           mEntityDecoder -    setStartElementHandler parser $ \cName cAttrs -> do+    setStartElementHandler parser $ \_ cName cAttrs -> do         name <- textFromCString cName         attrs <- forM cAttrs $ \(cAttrName,cAttrValue) -> do             attrName <- textFromCString cAttrName@@ -349,10 +335,10 @@             return (attrName, attrValue)         modifyIORef stack (start name attrs)         return True-    setEndElementHandler parser $ \_ -> do+    setEndElementHandler parser $ \_ _ -> do         modifyIORef stack end         return True-    setCharacterDataHandler parser $ \cText -> do+    setCharacterDataHandler parser $ \_ cText -> do         txt <- gxFromCStringLen cText         modifyIORef stack (text txt)         return True
hexpat.cabal view
@@ -1,6 +1,6 @@ Cabal-Version: >= 1.6 Name: hexpat-Version: 0.14+Version: 0.15 Synopsis: wrapper for expat, the fast XML parser Description:   This package provides a general purpose Haskell XML library using Expat to@@ -38,6 +38,9 @@   @cabal install hexpat --extra-lib-dirs="C:\\Program Files\\Expat 2.0.1\\Bin" --extra-include-dirs="C:\\Program Files\\Expat 2.0.1\\Source\\Lib"@   .   Ensure @libexpat.dll@ can be found in your system PATH (or copy it into your executable's directory).+  .+  ChangeLog: 0.15 changes intended to fix a (rare) \"error: a C finalizer called back into Haskell.\"+    that seemed only to happen only on ghc6.12.X. Category: XML License: BSD3 License-File: LICENSE
test/suite/Text/XML/Expat/UnitTests.hs view
@@ -105,11 +105,11 @@             toByteString "1><hello></he",             toByteString "llo></open>"]     parser <- newParser Nothing-    setStartElementHandler parser $ \cname cattrs -> do+    setStartElementHandler parser $ \_ cname cattrs -> do         name <- peekCString cname         ref <- modifyIORef ref $ \l -> ("start "++name):l         return True-    setEndElementHandler parser $ \cname -> do+    setEndElementHandler parser $ \_ cname -> do         name <- peekCString cname         ref <- modifyIORef ref $ \l -> ("end "++name):l         return True