@@ -62,9 +62,9 @@ data Event =
6262 | EventDocumentEnd
6363 | EventAlias !AnchorName
6464 | EventScalar !ByteString !Tag !Style !Anchor
65− | EventSequenceStart !Tag !Anchor
65+ | EventSequenceStart !Tag !Style !Anchor
6666 | EventSequenceEnd
67− | EventMappingStart !Tag !Anchor
67+ | EventMappingStart !Tag !Style !Anchor
6868 | EventMappingEnd
6969 deriving (Show, Eq)
7070
@@ -229,8 +229,11 @@ foreign import ccall unsafe "get_scalar_anchor"
229229foreign import ccall unsafe "get_sequence_start_anchor"
230230 c_get_sequence_start_anchor :: EventRaw -> IO CString
231231
232+foreign import ccall unsafe "get_sequence_start_style"
233+ c_get_sequence_start_style :: EventRaw -> IO CInt
234+
232235foreign import ccall unsafe "get_sequence_start_tag"
233− c_get_sequence_start_tag :: EventRaw -> IO CString
236+ c_get_sequence_start_tag :: EventRaw -> IO (Ptr CUChar)
234237
235238foreign import ccall unsafe "get_sequence_start_tag_len"
236239 c_get_sequence_start_tag_len :: EventRaw -> IO CULong
@@ -238,8 +241,11 @@ foreign import ccall unsafe "get_sequence_start_tag_len"
238241foreign import ccall unsafe "get_mapping_start_anchor"
239242 c_get_mapping_start_anchor :: EventRaw -> IO CString
240243
244+foreign import ccall unsafe "get_mapping_start_style"
245+ c_get_mapping_start_style :: EventRaw -> IO CInt
246+
241247foreign import ccall unsafe "get_mapping_start_tag"
242− c_get_mapping_start_tag :: EventRaw -> IO CString
248+ c_get_mapping_start_tag :: EventRaw -> IO (Ptr CUChar)
243249
244250foreign import ccall unsafe "get_mapping_start_tag_len"
245251 c_get_mapping_start_tag_len :: EventRaw -> IO CULong
@@ -247,6 +253,30 @@ foreign import ccall unsafe "get_mapping_start_tag_len"
247253foreign import ccall unsafe "get_alias_anchor"
248254 c_get_alias_anchor :: EventRaw -> IO CString
249255
256+readAnchor :: (EventRaw -> IO CString) -> (EventRaw -> IO Anchor)
257+readAnchor getAnchor er = do
258+ yanchor <- getAnchor er
259+ if yanchor == nullPtr
260+ then return Nothing
261+ else Just <$> peekCString yanchor
262+
263+readStyle :: (EventRaw -> IO CInt) -> (EventRaw -> IO Style)
264+readStyle getStyle er = do
265+ ystyle <- getStyle er
266+ return $ toEnum $ fromEnum ystyle
267+
268+readTag ::
269+ (EventRaw -> IO (Ptr CUChar)) -> (EventRaw -> IO CULong) -> (EventRaw -> IO Tag)
270+readTag getTag getTagLen er = do
271+ ytag <- getTag er
272+ ytag_len <- getTagLen er
273+ let ytag' = castPtr ytag
274+ let ytag_len' = fromEnum ytag_len
275+ bsToTag <$>
276+ if ytag_len' == 0
277+ then return Data.ByteString.empty
278+ else packCStringLen (ytag', ytag_len')
279+
250280getEvent :: EventRaw -> IO (Maybe Event)
251281getEvent er = do
252282 et <- c_get_event_type er
@@ -265,59 +295,24 @@ getEvent er = do
265295 YamlScalarEvent -> do
266296 yvalue <- c_get_scalar_value er
267297 ylen <- c_get_scalar_length er
268− ytag <- c_get_scalar_tag er
269− ytag_len <- c_get_scalar_tag_len er
270− ystyle <- c_get_scalar_style er
271− let ytag_len' = fromEnum ytag_len
272298 let yvalue' = castPtr yvalue
273− let ytag' = castPtr ytag
274299 let ylen' = fromEnum ylen
275300 bs <- packCStringLen (yvalue', ylen')
276− tagbs <-
277− if ytag_len' == 0
278− then return Data.ByteString.empty
279− else packCStringLen (ytag', ytag_len')
280− let style = toEnum $ fromEnum ystyle
281− yanchor <- c_get_scalar_anchor er
282− anchor <- if yanchor == nullPtr
283− then return Nothing
284− else Just <$> peekCString yanchor
285− return $ Just $ EventScalar bs (bsToTag tagbs) style anchor
301+ tag <- readTag c_get_scalar_tag c_get_scalar_tag_len er
302+ style <- readStyle c_get_scalar_style er
303+ anchor <- readAnchor c_get_scalar_anchor er
304+ return $ Just $ EventScalar bs tag style anchor
286305 YamlSequenceStartEvent -> do
287− yanchor <- c_get_sequence_start_anchor er
288− anchor <- if yanchor == nullPtr
289− then return Nothing
290− else Just <$> peekCString yanchor
291− ytag <- c_get_sequence_start_tag er
292− tag <- if ytag == nullPtr
293− then return NoTag
294− else do
295− ytag_len <- c_get_sequence_start_tag_len er
296− let ytag' = castPtr ytag
297− let ytag_len' = fromEnum ytag_len
298− bsToTag <$>
299− if ytag_len' == 0
300− then return Data.ByteString.empty
301− else packCStringLen (ytag', ytag_len')
302− return $ Just $ EventSequenceStart tag anchor
306+ tag <- readTag c_get_sequence_start_tag c_get_sequence_start_tag_len er
307+ style <- readStyle c_get_sequence_start_style er
308+ anchor <- readAnchor c_get_sequence_start_anchor er
309+ return $ Just $ EventSequenceStart tag style anchor
303310 YamlSequenceEndEvent -> return $ Just EventSequenceEnd
304311 YamlMappingStartEvent -> do
305− yanchor <- c_get_mapping_start_anchor er
306− anchor <- if yanchor == nullPtr
307− then return Nothing
308− else Just <$> peekCString yanchor
309− ytag <- c_get_mapping_start_tag er
310− tag <- if ytag == nullPtr
311− then return NoTag
312− else do
313− ytag_len <- c_get_mapping_start_tag_len er
314− let ytag' = castPtr ytag
315− let ytag_len' = fromEnum ytag_len
316− bsToTag <$>
317− if ytag_len' == 0
318− then return Data.ByteString.empty
319− else packCStringLen (ytag', ytag_len')
320− return $ Just $ EventMappingStart tag anchor
312+ tag <- readTag c_get_mapping_start_tag c_get_mapping_start_tag_len er
313+ style <- readStyle c_get_mapping_start_style er
314+ anchor <- readAnchor c_get_mapping_start_anchor er
315+ return $ Just $ EventMappingStart tag style anchor
321316 YamlMappingEndEvent -> return $ Just EventMappingEnd
322317
323318-- Emitter
@@ -464,7 +459,7 @@ toEventRaw e f = allocaBytes eventSize $ \er -> do
464459 0 -- plain_implicit
465460 qi -- quoted_implicit
466461 style' -- style
467− EventSequenceStart tag Nothing ->
462+ EventSequenceStart tag style Nothing ->
468463 withCString (tagToString tag) $ \tag' -> do
469464 let tagP = castPtr tag'
470465 c_yaml_sequence_start_event_initialize
@@ -472,8 +467,8 @@ toEventRaw e f = allocaBytes eventSize $ \er -> do
472467 nullPtr
473468 tagP
474469 1
475− 0 -- YAML_ANY_SEQUENCE_STYLE
476− EventSequenceStart tag (Just anchor) ->
470+ (toEnum $ fromEnum style)
471+ EventSequenceStart tag style (Just anchor) ->
477472 withCString (tagToString tag) $ \tag' -> do
478473 let tagP = castPtr tag'
479474 withCString anchor $ \anchor' -> do
@@ -483,10 +478,10 @@ toEventRaw e f = allocaBytes eventSize $ \er -> do
483478 anchorP
484479 tagP
485480 1
486− 0 -- YAML_ANY_SEQUENCE_STYLE
481+ (toEnum $ fromEnum style)
487482 EventSequenceEnd ->
488483 c_yaml_sequence_end_event_initialize er
489− EventMappingStart tag Nothing ->
484+ EventMappingStart tag style Nothing ->
490485 withCString (tagToString tag) $ \tag' -> do
491486 let tagP = castPtr tag'
492487 c_yaml_mapping_start_event_initialize
@@ -494,8 +489,8 @@ toEventRaw e f = allocaBytes eventSize $ \er -> do
494489 nullPtr
495490 tagP
496491 1
497− 0 -- YAML_ANY_SEQUENCE_STYLE
498− EventMappingStart tag (Just anchor) ->
492+ (toEnum $ fromEnum style)
493+ EventMappingStart tag style (Just anchor) ->
499494 withCString (tagToString tag) $ \tag' -> do
500495 withCString anchor $ \anchor' -> do
501496 let tagP = castPtr tag'
@@ -505,7 +500,7 @@ toEventRaw e f = allocaBytes eventSize $ \er -> do
505500 anchorP
506501 tagP
507502 1
508− 0 -- YAML_ANY_SEQUENCE_STYLE
503+ (toEnum $ fromEnum style)
509504 EventMappingEnd ->
510505 c_yaml_mapping_end_event_initialize er
511506 EventAlias anchor ->