Skip to content

Commit

Permalink
Compression.hs: checkingCtrlBreak moved to another module
Browse files Browse the repository at this point in the history
git-svn-id: https://freearc.svn.sourceforge.net/svnroot/freearc@420 3a4f7f31-9599-433d-91b1-573e8b61252c
  • Loading branch information
bulatz committed Jun 19, 2009
1 parent 3b9f0c1 commit 988fd19
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 24 deletions.
12 changes: 10 additions & 2 deletions ArcvProcessExtract.hs
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,12 @@ de_compress_PROCESS1 de_compress reader times command comprMethod num pipe = do
-- Ïðî÷èå (íåïîääåðæèâàåìûå) callbacks
callback _ _ _ = return aFREEARC_ERRCODE_NOT_IMPLEMENTED

-- Ïîñêîëüêó Haskell'îâñêèé êîä, âûçûâàåìûé èç Ñè, íå ìîæåò ïîëó÷àòü èñêëþ÷åíèé, äîáàâèì ê ïðîöåäóðàì ÷òåíèÿ/çàïèñè ÿâíûå ïðîâåðêè
let checked_callback what buf size = do
operationTerminated' <- val operationTerminated
if operationTerminated'
then return CompressionLib.aFREEARC_ERRCODE_OPERATION_TERMINATED -- foreverM doNothing0
else callback what buf size
{-
-- Debugging wrapper
debug f what buf size = inside (print (comprMethod,what,size))
Expand All @@ -184,8 +190,10 @@ de_compress_PROCESS1 de_compress reader times command comprMethod num pipe = do
debug f what buf size = f what buf size

-- ÑÎÁÑÒÂÅÍÍÎ ÓÏÀÊÎÂÊÀ ÈËÈ ÐÀÑÏÀÊÎÂÊÀ
result <- de_compress num comprMethod (debug callback)
debug callback "finished" nullPtr result
res <- debug checked_callback "read" nullPtr 0 -- ýòîò âûçîâ ïîçâîëÿåò îòëîæèòü çàïóñê ñëåäóþùåãî â öåïî÷êå àëãîðèòìà óïàêîâêè/ðàñïàêîâêè äî ìîìåíòà, êîãäà ïðåäûäóùèé âîçâðàòèò õîòü êàêèå-íèáóäü äàííûå (à åñëè ýòî ïîáëî÷íûé àëãîðèòì - äî ìîìåíòà, êîãäà îí îáðàáîòàåò âåñü áëîê)
result <- if res<0 then return res
else de_compress num comprMethod (debug checked_callback)
debug checked_callback "finished" nullPtr result
-- Ñòàòèñòèêà
total <- val total'
time <- val time'
Expand Down
18 changes: 2 additions & 16 deletions Compression.hs
Original file line number Diff line number Diff line change
Expand Up @@ -257,25 +257,12 @@ decompress method callback -
-- |Ïðîöåäóðû óïàêîâêè äëÿ ðàçëè÷íûõ àëãîðèòìîâ ñæàòèÿ.
freearcCompress num method | aSTORING == method = copy_data
freearcCompress num method | isFakeMethod method = eat_data
freearcCompress num method = checkingCtrlBreak num (CompressionLib.compress method)
freearcCompress num method = CompressionLib.compress method

-- |Ïðîöåäóðû ðàñïàêîâêè äëÿ ðàçëè÷íûõ àëãîðèòìîâ ñæàòèÿ.
freearcDecompress num method | aSTORING == method = copy_data
freearcDecompress num method | isFakeMethod method = impossible_to_decompress -- ýòè òèïû ñæàòûõ äàííûõ íå ïîäëåæàò ðàñïàêîâêå
freearcDecompress num method = checkingCtrlBreak num (CompressionLib.decompress method)

-- |Ïîñêîëüêó Haskell'îâñêèé êîä, âûçûâàåìûé èç Ñè, íå ìîæåò ïîëó÷àòü
-- èñêëþ÷åíèé, äîáàâèì ê ïðîöåäóðàì ÷òåíèÿ/çàïèñè ÿâíûå ïðîâåðêè
checkingCtrlBreak num action callback = do
let checked_callback what buf size auxdata = do
operationTerminated' <- val operationTerminated
if operationTerminated'
then return CompressionLib.aFREEARC_ERRCODE_OPERATION_TERMINATED -- foreverM doNothing0
else callback what buf size
--
res <- checked_callback "read" nullPtr 0 undefined -- ýòîò âûçîâ ïîçâîëÿåò îòëîæèòü çàïóñê ñëåäóþùåãî â öåïî÷êå àëãîðèòìà óïàêîâêè/ðàñïàêîâêè äî ìîìåíòà, êîãäà ïðåäûäóùèé âîçâðàòèò õîòü êàêèå-íèáóäü äàííûå (à åñëè ýòî ïîáëî÷íûé àëãîðèòì - äî ìîìåíòà, êîãäà îí îáðàáîòàåò âåñü áëîê)
if res<0 then return res
else action (checked_callback)
freearcDecompress num method = CompressionLib.decompress method

-- |Êîïèðîâàíèå äàííûõ áåç ñæàòèÿ (-m0)
copy_data callback = do
Expand Down Expand Up @@ -309,7 +296,6 @@ eat_data callback = do
impossible_to_decompress callback = do
return CompressionLib.aFREEARC_ERRCODE_GENERAL -- ñðàçó âîçâðàòèòü îøèáêó, ïîñêîëüêó ýòîò àëãîðèòì (FAKE/CRC_ONLY) íå ïîäëåæèò ðàñïàêîâêå

{-# NOINLINE checkingCtrlBreak #-}
{-# NOINLINE copy_data #-}
{-# NOINLINE eat_data #-}

Expand Down
13 changes: 7 additions & 6 deletions Compression/CompressionLib.hs
Original file line number Diff line number Diff line change
Expand Up @@ -124,10 +124,11 @@ runWithMethod action method callback = do

-- |Execute C (de)compression routine `action` using read/write callbacks `read_f` & `write_f`
run action callback = do
-- Ignore auxdata since we can do better with closures
let callback2 cwhat buf size auxdata = do what <- peekCString cwhat
callback what buf (ii size) auxdata >>=return.ii
callback what buf (ii size) >>=return.ii
bracket (mkCALL_BACK callback2) (freeHaskellFunPtr)$ \c_callback -> do -- convert Haskell routine to C-callable routine
action c_callback c_callback
action c_callback nullPtr

withMethod action method inp insize outp outsize = do
withCString method $ \c_method -> do
Expand Down Expand Up @@ -189,19 +190,19 @@ compressionErrorMessage x

-- |Compress using callbacks
foreign import ccall threadsafe "Compression.h Compress"
c_compress :: CMethod -> FunPtr CALLBACK_FUNC -> FunPtr CALLBACK_FUNC -> IO Int
c_compress :: CMethod -> FunPtr CALLBACK_FUNC -> VoidPtr -> IO Int

-- |Decompress using callbacks
foreign import ccall threadsafe "Compression.h Decompress"
c_decompress :: CMethod -> FunPtr CALLBACK_FUNC -> FunPtr CALLBACK_FUNC -> IO Int
c_decompress :: CMethod -> FunPtr CALLBACK_FUNC -> VoidPtr -> IO Int

-- |Compress using callbacks and save method name in compressed output
foreign import ccall threadsafe "Compression.h CompressWithHeader"
c_CompressWithHeader :: CMethod -> FunPtr CALLBACK_FUNC -> FunPtr CALLBACK_FUNC -> IO Int
c_CompressWithHeader :: CMethod -> FunPtr CALLBACK_FUNC -> VoidPtr -> IO Int

-- |Decompress data compressed with c_CompressWithHeader (method name is read from compressed stream)
foreign import ccall threadsafe "Compression.h DecompressWithHeader"
c_DecompressWithHeader :: FunPtr CALLBACK_FUNC -> FunPtr CALLBACK_FUNC -> IO Int
c_DecompressWithHeader :: FunPtr CALLBACK_FUNC -> VoidPtr -> IO Int


----------------------------------------------------------------------------------------------------
Expand Down

0 comments on commit 988fd19

Please sign in to comment.