Changeset 15829 for third-party
- Timestamp:
- 04/04/07 19:54:22 (20 months ago)
- Files:
-
- 1 modified
-
third-party/HsSyck/Data/Yaml/Syck.hsc (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
third-party/HsSyck/Data/Yaml/Syck.hsc
r15828 r15829 71 71 deriving (Show, Ord, Eq, Enum) 72 72 73 maxId :: SYMID74 maxId = maxBound75 76 73 nilNode :: YamlNode 77 nilNode = MkNode maxIdENil Nothing ASingleton74 nilNode = MkNode 0 ENil Nothing ASingleton 78 75 79 76 {-# INLINE unpackBuf #-} … … 90 87 91 88 mkNode :: YamlElem -> YamlNode 92 mkNode x = MkNode maxIdx Nothing ASingleton89 mkNode x = MkNode 0 x Nothing ASingleton 93 90 94 91 mkTagNode :: String -> YamlElem -> YamlNode 95 mkTagNode tag e = MkNode maxIde (Just $! packBuf tag) ASingleton92 mkTagNode tag e = MkNode 0 e (Just $! packBuf tag) ASingleton 96 93 97 94 mkTagStrNode :: String -> String -> YamlNode … … 189 186 withTag n (Ptr "array"##) $ \tag -> 190 187 syck_emit_seq e tag seqInline 191 -- syck_emit_seq e tag seqNone192 188 mapM_ (syck_emit_item e) =<< mapM freeze sq 193 189 syck_emit_end e … … 196 192 withTag n (Ptr "map"##) $ \tag -> 197 193 syck_emit_map e tag mapInline 198 -- syck_emit_map e tag mapNone199 194 flip mapM_ m (\(k,v) -> do 200 195 syck_emit_item e =<< freeze k … … 237 232 nodeCallback :: BadAnchorTable -> SyckParser -> SyckNode -> IO SYMID 238 233 nodeCallback badancs parser syckNode = mdo 239 nodeId <- #{peek SyckNode, id} syckNode240 234 kind <- syckNodeKind syckNode 241 242 let makeRegularNode = do243 len <- syckNodeLength kind syckNode244 parseNode kind parser syckNode len symId245 246 235 node <- case kind of 247 236 SyckMap -> do … … 251 240 -- print ("bad anchor wanted", syckNode) 252 241 unsafeInterleaveIO (fmap fromJust (Hash.lookup badancs (nodePtr `minusPtr` nullPtr))) 253 _ -> makeRegularNode 254 _ -> makeRegularNode 242 _ -> makeRegularNode kind 243 _ -> makeRegularNode kind 255 244 nodePtr <- writeNode node 256 245 257 246 -- Do something here about circular refs. 247 nodeId <- #{peek SyckNode, id} syckNode 258 248 case nodeId :: SYMID of 259 249 0 -> return False … … 264 254 Hash.update badancs (ptr `minusPtr` nullPtr) node 265 255 266 symId <- fmap fromIntegral (syck_add_sym parser nodePtr) 267 268 return symId 256 symId <- syck_add_sym parser nodePtr 257 return (fromIntegral symId) 258 where 259 makeRegularNode kind = do 260 len <- syckNodeLength kind syckNode 261 parseNode kind parser syckNode len 269 262 270 263 badAnchorHandlerCallback :: BadAnchorTable -> SyckBadAnchorHandler … … 290 283 freezeNode :: Hash.HashTable Int (Ptr a) -> YamlNode -> IO (Ptr a) 291 284 freezeNode nodes MkNode{ n_anchor = AReference n } = do 292 rv <- Hash.lookup nodes n 293 case rv of 294 Just ptr -> return ptr 295 _ -> fail $ "Failed to resolve reference: " ++ show n 285 Just ptr <- Hash.lookup nodes n 286 return ptr 296 287 freezeNode nodes node = do 297 288 ptr <- newStablePtr node … … 350 341 syckNodeLength SyckStr = (#{peek struct SyckStr, len} =<<) . #{peek SyckNode, data} 351 342 352 parseNode :: SyckKind -> SyckParser -> SyckNode -> CLong -> SYMID ->IO YamlNode353 parseNode SyckMap parser syckNode len nid= do343 parseNode :: SyckKind -> SyckParser -> SyckNode -> CLong -> IO YamlNode 344 parseNode SyckMap parser syckNode len = do 354 345 tag <- syckNodeTag syckNode 355 346 pairs <- (`mapM` [0..len-1]) $ \idx -> do … … 359 350 val <- readNode parser valId 360 351 return (key, val) 361 return $ nilNode{ n_elem = EMap pairs, n_tag = tag , n_id = nid}362 363 parseNode SyckSeq parser syckNode len nid= do352 return $ nilNode{ n_elem = EMap pairs, n_tag = tag} 353 354 parseNode SyckSeq parser syckNode len = do 364 355 tag <- syckNodeTag syckNode 365 356 nodes <- (`mapM` [0..len-1]) $ \idx -> do 366 357 symId <- syck_seq_read syckNode idx 367 358 readNode parser symId 368 return $ nilNode{ n_elem = ESeq nodes, n_tag = tag , n_id = nid}369 370 parseNode SyckStr _ syckNode len nid= do359 return $ nilNode{ n_elem = ESeq nodes, n_tag = tag } 360 361 parseNode SyckStr _ syckNode len = do 371 362 tag <- syckNodeTag syckNode 372 363 cstr <- syck_str_read syckNode 373 364 buf <- copyCStringLen (cstr, fromEnum len) 374 let node = nilNode{ n_elem = EStr buf, n_tag = tag , n_id = nid}365 let node = nilNode{ n_elem = EStr buf, n_tag = tag } 375 366 if tag == Nothing && Buf.length buf == 1 && Buf.index buf 0 == '~' 376 367 then do
