Adjust to new libdpkg API
authorJoachim Breitner <mail@joachim-breitner.de>
Thu, 5 Jul 2012 20:49:03 +0000 (22:49 +0200)
committerJoachim Breitner <mail@joachim-breitner.de>
Thu, 5 Jul 2012 20:49:03 +0000 (22:49 +0200)
DebVersionCmp.hs

index ba099ea..ee27abe 100644 (file)
@@ -16,10 +16,12 @@ import qualified Data.ByteString as BS
 
 data ParsedVersion
 
+data DpkgError
+
 foreign import ccall unsafe "dpkg/dpkg-db.h parseversion"
-    c_ParseVersion :: Ptr ParsedVersion -> CString -> IO CString
+    c_ParseVersion :: Ptr ParsedVersion -> CString -> Ptr DpkgError -> IO CInt
 
-foreign import ccall unsafe "dpkg/dpkg-db.h versioncompare"
+foreign import ccall unsafe "dpkg/version.h dpkg_version_compare"
     c_VersionCompare :: Ptr ParsedVersion -> Ptr ParsedVersion -> IO CInt
 
 foreign export ccall "thisname" blubb :: ()
@@ -31,14 +33,15 @@ versionCompare :: BS.ByteString -> BS.ByteString -> Ordering
 versionCompare v1 v2 = unsafePerformIO $
     -- 12 bytes is enough to carry a struct versionrevision
     allocaBytes 12 $ \ptr1 -> allocaBytes 12 $ \ptr2 ->  
+    allocaBytes 16 $ \eptr -> 
     BS.useAsCString v1 $ \v1p -> BS.useAsCString v2 $ \v2p -> do
-        r1 <- c_ParseVersion ptr1 v1p
-        if (r1 /= nullPtr)
-            then peekCString r1 >>= \err -> error $ "Failed to parse " ++ show v1 ++ ": " ++ err
+        r1 <- c_ParseVersion ptr1 v1p eptr
+        if (r1 /= 0)
+            then peekCString (castPtr (eptr `plusPtr` 8)) >>= \err -> error $ "Failed to parse " ++ show v1 ++ ": " ++ err
             else do
-        r2 <- c_ParseVersion ptr2 v2p
-        if (r2 /= nullPtr
-            then peekCString r2 >>= \err -> error $ "Failed to parse " ++ show v2 ++ ": " ++ err
+        r2 <- c_ParseVersion ptr2 v2p eptr
+        if (r2 /= 0
+            then peekCString (castPtr (eptr `plusPtr` 8)) >>= \err -> error $ "Failed to parse " ++ show v2 ++ ": " ++ err
             else do
         r3 <- c_VersionCompare ptr1 ptr2
         return $ if r3 < 0 then LT else if r3 == 0 then EQ else GT