Changeset 8586
- Timestamp:
- 01/05/06 20:28:39 (3 years ago)
- Location:
- src
- Files:
-
- 3 modified
-
Data/Yaml/Syck.hsc (modified) (7 diffs)
-
Pugs/Prim.hs (modified) (1 diff)
-
Pugs/Prim/Yaml.hs (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Data/Yaml/Syck.hsc
r8585 r8586 46 46 -- the extra comma here is not a bug 47 47 #enum CInt, , scalar_none, scalar_1quote, scalar_2quote, scalar_fold, scalar_literal, scalar_plain 48 #enum CInt, , seq_none, seq_inline 49 #enum CInt, , map_none, map_inline 48 50 49 51 #def typedef void* EmitterExtras; … … 88 90 case node of 89 91 YamlNil -> do 90 -- returnsyck_emit_scalar(e, "string", scalar_none, 0, 0, 0, "~", 1);92 -- syck_emit_scalar(e, "string", scalar_none, 0, 0, 0, "~", 1); 91 93 withCString "string" $ \string_literal -> 92 94 withCString "~" $ \cs -> … … 97 99 withCString str $ \cs -> 98 100 syck_emit_scalar e string_literal scalarNone 0 0 0 cs (toEnum $ length str) 101 (YamlSeq seq) -> do 102 -- syck_emit_seq(e, "array", seq_none); 103 withCString "array" $ \array_literal -> 104 syck_emit_seq e array_literal seqNone 105 mapM_ (syck_emit_item e) =<< (mapM freezeNode seq) 106 syck_emit_end e 107 (YamlMap m) -> do 108 error "not yet" 109 -- syck_emit_map(e, "hash", map_none); 110 withCString "hash" $ \hash_literal -> 111 syck_emit_map e hash_literal mapNone 112 99 113 100 114 parseYaml :: String -> IO (Either String (Maybe YamlNode)) … … 119 133 len <- syckNodeLength kind syckNode 120 134 node <- parseNode kind parser syckNode len 121 nodePtr <- freezeNode node135 nodePtr <- writeNode node 122 136 symId <- syck_add_sym parser nodePtr 123 137 return (toEnum . fromEnum $ symId) … … 135 149 ] 136 150 137 --freezeNode :: YamlNode -> IO SyckNodePtr 151 freezeNode :: YamlNode -> IO (Ptr a) 138 152 freezeNode node = do 139 153 ptr <- newStablePtr node … … 142 156 thawNode :: Ptr () -> IO YamlNode 143 157 thawNode nodePtr = deRefStablePtr (castPtrToStablePtr nodePtr) 158 159 writeNode :: YamlNode -> IO SyckNodePtr 160 writeNode node = do 161 ptr <- newStablePtr node 162 new (castPtr $ castStablePtrToPtr ptr) 144 163 145 164 readNode :: SyckParser -> SYMID -> IO YamlNode … … 250 269 syck_emit_scalar :: SyckEmitter -> CString -> CInt -> CInt -> CInt -> CInt -> CString -> CInt -> IO () 251 270 271 foreign import ccall 272 syck_emit_seq :: SyckEmitter -> CString -> CInt -> IO () 273 274 foreign import ccall 275 syck_emit_item :: SyckEmitter -> SyckNodePtr -> IO () 276 277 foreign import ccall 278 syck_emit_end :: SyckEmitter -> IO () 279 280 foreign import ccall 281 syck_emit_map :: SyckEmitter -> CString -> CInt -> IO () 282 -
src/Pugs/Prim.hs
r8566 r8586 223 223 op1 "none" = op1Cast opJuncNone 224 224 op1 "perl" = fmap VStr . prettyVal 0 225 op1 "yaml" = dumpYaml 225 op1 "yaml" = dumpYaml 1024 -- number == max recursion depth 226 226 op1 "require_haskell" = \v -> do 227 227 name <- fromVal v -
src/Pugs/Prim/Yaml.hs
r8585 r8586 36 36 return $ VRef (hashRef hv) 37 37 38 dumpYaml :: Val -> Eval Val39 dumpYaml v = do40 obj <- toYaml =<< fromVal v38 dumpYaml :: Int -> Val -> Eval Val 39 dumpYaml limit v = do 40 obj <- toYaml limit =<< fromVal v 41 41 rv <- liftIO (emitYaml obj) 42 42 case rv of … … 44 44 Right str -> return $ VStr str 45 45 46 toYaml :: Val -> Eval YamlNode 47 toYaml VUndef = return YamlNil 48 --toYaml (VNum num) = return $ YamlStr -- better handled by pretty 49 toYaml (VStr str) = return $ YamlStr (encodeUTF8 str) 50 toYaml (VList nodes) = do 51 fmap YamlSeq $ mapM toYaml nodes 52 toYaml x = return $ YamlStr $ encodeUTF8 $ pretty x 53 --toYaml (VHash hash) = do 54 -- fmap YamlMap $ Map.toList hash 46 toYaml :: Int -> Val -> Eval YamlNode 47 toYaml 0 _ = return $ YamlStr "<deep recursion>" -- fail? make this configurable? 48 toYaml _ VUndef = return YamlNil 49 --toYaml (VNum num) = return $ YamlStr -- better handled by pretty? 50 toYaml _ (VStr str) = return $ YamlStr (encodeUTF8 str) 51 toYaml (d+1) (VList nodes) = do 52 fmap YamlSeq $ mapM (toYaml d) nodes 53 toYaml (d+1) v@(VRef r) = do -- stolen from Pugs.Prim prettyVal. Can these be refactored together? 54 v' <- readRef r 55 ifValTypeIsa v "Pair" 56 (case v' of 57 VList [ks, vs] -> do 58 kStr <- toYaml d ks 59 vStr <- toYaml d vs 60 return $ YamlMap [(kStr, vStr)] -- assume a pair is a one-element hash 61 _ -> toYaml d v' -- XXX: probably broken to blithingly ignore ref levels here 62 ) 63 (do nodes <- toYaml d v' 64 ifValTypeIsa v "Array" 65 (return $ nodes) 66 (ifValTypeIsa v "Hash" 67 --(return $ YamlMap('{':(init (tail str))) ++ "}") 68 (return nodes) 69 (return $ YamlMap [(YamlStr "<ref>", nodes)])) -- XXX 70 ) 71 toYaml _ v = return $ YamlStr $ encodeUTF8 $ pretty v 55 72 56 73
