@@ -9,144 +9,150 @@ import Bindings.Libgit2
99import Control.Applicative
1010import Control.Monad
1111import Foreign.C.String
12+ import Foreign.ForeignPtr
1213import Foreign.Marshal.Utils
1314import Foreign.Ptr
1415import Foreign.Storable
1516import Git.Libgit2.Backend
1617import Prelude hiding (mapM_ )
1718
18- data TraceBackend = TraceBackend { traceParent :: C'git_odb_backend
19- , traceNext :: Ptr C'git_odb_backend }
20-
21- instance Storable TraceBackend where
22- sizeOf _ = sizeOf (undefined :: C'git_odb_backend ) +
23- sizeOf (undefined :: Ptr C'git_odb_backend )
24- alignment p = alignment (traceParent p)
25- peek p = do
26- v0 <- peekByteOff p 0
27- v1 <- peekByteOff p (sizeOf (undefined :: C'git_odb_backend ))
28- return (TraceBackend v0 v1)
29- poke p (TraceBackend v0 v1) = do
30- pokeByteOff p 0 v0
31- pokeByteOff p (sizeOf (undefined :: C'git_odb_backend )) v1
32- return ()
19+ -- data TraceBackend = TraceBackend { traceParent :: C'git_odb_backend
20+ -- , traceNext :: Ptr C'git_odb_backend }
21+ --
22+ -- instance Storable TraceBackend where
23+ -- sizeOf _ = sizeOf (undefined :: C'git_odb_backend) +
24+ -- sizeOf (undefined :: Ptr C'git_odb_backend)
25+ -- alignment p = alignment (traceParent p)
26+ -- peek p = do
27+ -- v0 <- peekByteOff p 0
28+ -- v1 <- peekByteOff p (sizeOf (undefined :: C'git_odb_backend))
29+ -- return (TraceBackend v0 v1)
30+ -- poke p (TraceBackend v0 v1) = do
31+ -- pokeByteOff p 0 v0
32+ -- pokeByteOff p (sizeOf (undefined :: C'git_odb_backend)) v1
33+ -- return ()
3334
3435oidToStr :: Ptr C'git_oid -> Int -> IO String
35- oidToStr oid len = c'git_oid_allocfmt oid >>= fmap (take len) . peekCString
36-
37- traceBackendReadCallback :: F'git_odb_backend_read_callback
38- traceBackendReadCallback data_p len_p type_p be oid = do
39- oidStr <- oidToStr oid 40
40- putStrLn $ " Read " ++ oidStr
41- tb <- peek (castPtr be :: Ptr TraceBackend )
42- tn <- peek (traceNext tb)
43- mK'git_odb_backend_read_callback
44- (c'git_odb_backend'read tn)
45- data_p
46- len_p
47- type_p
48- (traceNext tb)
49- oid
50-
51- traceBackendReadPrefixCallback :: F'git_odb_backend_read_prefix_callback
52- traceBackendReadPrefixCallback out_oid oid_p len_p type_p be oid len = do
53- oidStr <- oidToStr oid 40
54- putStrLn $ " Read Prefix " ++ oidStr ++ " " ++ show len
55- tb <- peek (castPtr be :: Ptr TraceBackend )
56- tn <- peek (traceNext tb)
57- mK'git_odb_backend_read_prefix_callback
58- (c'git_odb_backend'read_prefix tn)
59- out_oid
60- oid_p
61- len_p
62- type_p
63- (traceNext tb)
64- oid
65- len
66-
67- traceBackendReadHeaderCallback :: F'git_odb_backend_read_header_callback
68- traceBackendReadHeaderCallback len_p type_p be oid = do
69- oidStr <- oidToStr oid 40
70- putStrLn $ " Read Header " ++ oidStr
71- tb <- peek (castPtr be :: Ptr TraceBackend )
72- tn <- peek (traceNext tb)
73- mK'git_odb_backend_read_header_callback
74- (c'git_odb_backend'read_header tn)
75- len_p
76- type_p
77- (traceNext tb)
78- oid
79-
80- traceBackendWriteCallback :: F'git_odb_backend_write_callback
81- traceBackendWriteCallback oid be obj_data len obj_type = do
82- r <- c'git_odb_hash oid obj_data len obj_type
83- case r of
84- 0 -> do
85- oidStr <- oidToStr oid 40
86- putStrLn $ " Write " ++ oidStr ++ " len " ++ show len
87- tb <- peek (castPtr be :: Ptr TraceBackend )
88- tn <- peek (traceNext tb)
89- mK'git_odb_backend_write_callback
90- (c'git_odb_backend'write tn)
91- oid
92- (traceNext tb)
93- obj_data
94- len
95- obj_type
96- n -> return n
97-
98- traceBackendExistsCallback :: F'git_odb_backend_exists_callback
99- traceBackendExistsCallback be oid confirmNotExists = do
100- oidStr <- oidToStr oid 40
101- putStrLn $ " Exists " ++ oidStr
102- tb <- peek (castPtr be :: Ptr TraceBackend )
103- tn <- peek (traceNext tb)
104- mK'git_odb_backend_exists_callback
105- (c'git_odb_backend'exists tn)
106- (traceNext tb)
107- oid
108- confirmNotExists
109-
110- traceBackendFreeCallback :: F'git_odb_backend_free_callback
111- traceBackendFreeCallback be = do
112- backend <- peek be
113- freeHaskellFunPtr (c'git_odb_backend'read backend)
114- freeHaskellFunPtr (c'git_odb_backend'read_prefix backend)
115- freeHaskellFunPtr (c'git_odb_backend'read_header backend)
116- freeHaskellFunPtr (c'git_odb_backend'write backend)
117- freeHaskellFunPtr (c'git_odb_backend'exists backend)
118-
119- foreign export ccall " traceBackendFreeCallback"
120- traceBackendFreeCallback :: F'git_odb_backend_free_callback
121- foreign import ccall " &traceBackendFreeCallback"
122- traceBackendFreeCallbackPtr :: FunPtr F'git_odb_backend_free_callback
123-
124- traceBackend :: Ptr C'git_odb_backend -> IO (Ptr C'git_odb_backend )
125- traceBackend be = do
126- readFun <- mk'git_odb_backend_read_callback traceBackendReadCallback
127- readPrefixFun <-
128- mk'git_odb_backend_read_prefix_callback traceBackendReadPrefixCallback
129- readHeaderFun <-
130- mk'git_odb_backend_read_header_callback traceBackendReadHeaderCallback
131- writeFun <- mk'git_odb_backend_write_callback traceBackendWriteCallback
132- existsFun <- mk'git_odb_backend_exists_callback traceBackendExistsCallback
36+ oidToStr oid len = do
37+ ptr <- mallocForeignPtrArray0 len
38+ withForeignPtr ptr $ \ ptr' -> do
39+ _ <- c'git_oid_fmt ptr' oid
40+ str <- peekCString ptr'
41+ return $ take len str
13342
134- castPtr <$> new TraceBackend {
135- traceParent = C'git_odb_backend {
136- c'git_odb_backend'version = 1
137- , c'git_odb_backend'odb = nullPtr
138- , c'git_odb_backend'read = readFun
139- , c'git_odb_backend'read_prefix = readPrefixFun
140- , c'git_odb_backend'readstream = nullFunPtr
141- , c'git_odb_backend'read_header = readHeaderFun
142- , c'git_odb_backend'write = writeFun
143- , c'git_odb_backend'writestream = nullFunPtr
144- , c'git_odb_backend'exists = existsFun
145- , c'git_odb_backend'refresh = undefined
146- , c'git_odb_backend'foreach = undefined
147- , c'git_odb_backend'writepack = undefined
148- , c'git_odb_backend'free = traceBackendFreeCallbackPtr
149- }
150- , traceNext = be }
43+ -- traceBackendReadCallback :: F'git_odb_backend_read_callback
44+ -- traceBackendReadCallback data_p len_p type_p be oid = do
45+ -- oidStr <- oidToStr oid 40
46+ -- putStrLn $ "Read " ++ oidStr
47+ -- tb <- peek (castPtr be :: Ptr TraceBackend)
48+ -- tn <- peek (traceNext tb)
49+ -- mK'git_odb_backend_read_callback
50+ -- (c'git_odb_backend'read tn)
51+ -- data_p
52+ -- len_p
53+ -- type_p
54+ -- (traceNext tb)
55+ -- oid
56+ --
57+ -- traceBackendReadPrefixCallback :: F'git_odb_backend_read_prefix_callback
58+ -- traceBackendReadPrefixCallback out_oid oid_p len_p type_p be oid len = do
59+ -- oidStr <- oidToStr oid 40
60+ -- putStrLn $ "Read Prefix " ++ oidStr ++ " " ++ show len
61+ -- tb <- peek (castPtr be :: Ptr TraceBackend)
62+ -- tn <- peek (traceNext tb)
63+ -- mK'git_odb_backend_read_prefix_callback
64+ -- (c'git_odb_backend'read_prefix tn)
65+ -- out_oid
66+ -- oid_p
67+ -- len_p
68+ -- type_p
69+ -- (traceNext tb)
70+ -- oid
71+ -- len
72+ --
73+ -- traceBackendReadHeaderCallback :: F'git_odb_backend_read_header_callback
74+ -- traceBackendReadHeaderCallback len_p type_p be oid = do
75+ -- oidStr <- oidToStr oid 40
76+ -- putStrLn $ "Read Header " ++ oidStr
77+ -- tb <- peek (castPtr be :: Ptr TraceBackend)
78+ -- tn <- peek (traceNext tb)
79+ -- mK'git_odb_backend_read_header_callback
80+ -- (c'git_odb_backend'read_header tn)
81+ -- len_p
82+ -- type_p
83+ -- (traceNext tb)
84+ -- oid
85+ --
86+ -- traceBackendWriteCallback :: F'git_odb_backend_write_callback
87+ -- traceBackendWriteCallback oid be obj_data len obj_type = do
88+ -- r <- c'git_odb_hash oid obj_data len obj_type
89+ -- case r of
90+ -- 0 -> do
91+ -- oidStr <- oidToStr oid 40
92+ -- putStrLn $ "Write " ++ oidStr ++ " len " ++ show len
93+ -- tb <- peek (castPtr be :: Ptr TraceBackend)
94+ -- tn <- peek (traceNext tb)
95+ -- mK'git_odb_backend_write_callback
96+ -- (c'git_odb_backend'write tn)
97+ -- oid
98+ -- (traceNext tb)
99+ -- obj_data
100+ -- len
101+ -- obj_type
102+ -- n -> return n
103+ --
104+ -- traceBackendExistsCallback :: F'git_odb_backend_exists_callback
105+ -- traceBackendExistsCallback be oid confirmNotExists = do
106+ -- oidStr <- oidToStr oid 40
107+ -- putStrLn $ "Exists " ++ oidStr
108+ -- tb <- peek (castPtr be :: Ptr TraceBackend)
109+ -- tn <- peek (traceNext tb)
110+ -- mK'git_odb_backend_exists_callback
111+ -- (c'git_odb_backend'exists tn)
112+ -- (traceNext tb)
113+ -- oid
114+ -- confirmNotExists
115+ --
116+ -- traceBackendFreeCallback :: F'git_odb_backend_free_callback
117+ -- traceBackendFreeCallback be = do
118+ -- backend <- peek be
119+ -- freeHaskellFunPtr (c'git_odb_backend'read backend)
120+ -- freeHaskellFunPtr (c'git_odb_backend'read_prefix backend)
121+ -- freeHaskellFunPtr (c'git_odb_backend'read_header backend)
122+ -- freeHaskellFunPtr (c'git_odb_backend'write backend)
123+ -- freeHaskellFunPtr (c'git_odb_backend'exists backend)
124+ --
125+ -- foreign export ccall "traceBackendFreeCallback"
126+ -- traceBackendFreeCallback :: F'git_odb_backend_free_callback
127+ -- foreign import ccall "&traceBackendFreeCallback"
128+ -- traceBackendFreeCallbackPtr :: FunPtr F'git_odb_backend_free_callback
129+ --
130+ -- traceBackend :: Ptr C'git_odb_backend -> IO (Ptr C'git_odb_backend)
131+ -- traceBackend be = do
132+ -- readFun <- mk'git_odb_backend_read_callback traceBackendReadCallback
133+ -- readPrefixFun <-
134+ -- mk'git_odb_backend_read_prefix_callback traceBackendReadPrefixCallback
135+ -- readHeaderFun <-
136+ -- mk'git_odb_backend_read_header_callback traceBackendReadHeaderCallback
137+ -- writeFun <- mk'git_odb_backend_write_callback traceBackendWriteCallback
138+ -- existsFun <- mk'git_odb_backend_exists_callback traceBackendExistsCallback
139+ --
140+ -- castPtr <$> new TraceBackend {
141+ -- traceParent = C'git_odb_backend {
142+ -- c'git_odb_backend'version = 1
143+ -- , c'git_odb_backend'odb = nullPtr
144+ -- , c'git_odb_backend'read = readFun
145+ -- , c'git_odb_backend'read_prefix = readPrefixFun
146+ -- , c'git_odb_backend'readstream = nullFunPtr
147+ -- , c'git_odb_backend'read_header = readHeaderFun
148+ -- , c'git_odb_backend'write = writeFun
149+ -- , c'git_odb_backend'writestream = nullFunPtr
150+ -- , c'git_odb_backend'exists = existsFun
151+ -- , c'git_odb_backend'refresh = undefined
152+ -- , c'git_odb_backend'foreach = undefined
153+ -- , c'git_odb_backend'writepack = undefined
154+ -- , c'git_odb_backend'free = traceBackendFreeCallbackPtr
155+ -- }
156+ -- , traceNext = be }
151157
152158-- Trace.hs
0 commit comments