Skip to content

Commit

Permalink
CELS: now program compiles ok both with and without CELS ("storing" m…
Browse files Browse the repository at this point in the history
…ethod moved to C++ code, "crc" method properly implemented for CELS)

git-svn-id: https://freearc.svn.sourceforge.net/svnroot/freearc@453 3a4f7f31-9599-433d-91b1-573e8b61252c
  • Loading branch information
bulatz committed Jul 25, 2009
1 parent c9d3d6a commit 28b39c6
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 27 deletions.
33 changes: 8 additions & 25 deletions Compression.hs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
{-# OPTIONS_GHC -cpp #-}
----------------------------------------------------------------------------------------------------
---- Óïàêîâêà, ðàñïàêîâêà è âû÷èñëåíèå CRC. ----
---- Òèïû äàííûõ CompressionMethod, Compressor, UserCompressor - îïèñàíèå ìåòîäà ñæàòèÿ. ----
Expand All @@ -20,6 +21,7 @@ import Foreign.Marshal.Pool
import Foreign.Ptr
import System.IO.Unsafe

import qualified TABI
import qualified CompressionLib
import Utils
import Errors
Expand Down Expand Up @@ -255,39 +257,23 @@ decompress method callback -
-}

-- |Ïðîöåäóðû óïàêîâêè äëÿ ðàçëè÷íûõ àëãîðèòìîâ ñæàòèÿ.
--to do: freearcCompress num method | aSTORING == method = copy_data
--freearcCompress num method | isFakeMethod method = eat_data
freearcCompress num method | isFakeMethod method = eat_data
freearcCompress num method = CompressionLib.compress method

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

-- |Êîïèðîâàíèå äàííûõ áåç ñæàòèÿ (-m0)
copy_data callback = do
allocaBytes aHUGE_BUFFER_SIZE $ \buf -> do -- èñïîëüçóåì `alloca`, ÷òîáû àâòîìàòè÷åñêè îñâîáîäèòü âûäåëåííûé áóôåð ïðè âûõîäå
let go ptr = do
len <- callback "read" ptr ((buf+:aHUGE_BUFFER_SIZE)-:ptr)
if (len>0)
then do let newptr = ptr+:len
if newptr < buf+:aHUGE_BUFFER_SIZE
then go newptr
else do result <- callback "write" buf (newptr-:buf)
if (result>=0)
then go buf
else return (result) -- Âîçâðàòèì îòðèöàòåëüíîå ÷èñëî, åñëè ïðîèçîøëà îøèáêà/áîëüøå äàííûõ íå íóæíî
else do if (len==0 && ptr>buf)
then do result <- callback "write" buf (ptr-:buf)
return (if result>0 then 0 else result)
else return len -- Âîçâðàòèì 0, åñëè äàííûå êîí÷èëèñü, è îòðèöàòåëüíîå ÷èñëî, åñëè ïðîèçîøëà îøèáêà/áîëüøå äàííûõ íå íóæíî
go buf -- âîçâðàòèòü ðåçóëüòàò

{-# NOINLINE eat_data #-}
-- |×èòàåì âñ¸, íå ïèøåì íè÷åãî, à CRC ñ÷èòàåòñÿ â äðóãîì ìåñòå ;)
eat_data callback = do
allocaBytes aBUFFER_SIZE $ \buf -> do -- èñïîëüçóåì `alloca`, ÷òîáû àâòîìàòè÷åñêè îñâîáîäèòü âûäåëåííûé áóôåð ïðè âûõîäå
let go = do
#ifdef FREEARC_CELS
len <- TABI.call (\a->fromIntegral `fmap` callback a) [TABI.Pair "request" "read", TABI.Pair "buf" buf, TABI.Pair "size" (aBUFFER_SIZE::MemSize)]
#else
len <- callback "read" buf aBUFFER_SIZE
#endif
if (len>0)
then go
else return len -- Âîçâðàòèì 0, åñëè äàííûå êîí÷èëèñü, è îòðèöàòåëüíîå ÷èñëî, åñëè ïðîèçîøëà îøèáêà/áîëüøå äàííûõ íå íóæíî
Expand All @@ -296,9 +282,6 @@ eat_data callback = do
impossible_to_decompress callback = do
return CompressionLib.aFREEARC_ERRCODE_GENERAL -- ñðàçó âîçâðàòèòü îøèáêó, ïîñêîëüêó ýòîò àëãîðèòì (FAKE/CRC_ONLY) íå ïîäëåæèò ðàñïàêîâêå

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


----------------------------------------------------------------------------------------------------
----- CRC calculation ------------------------------------------------------------------------------
Expand Down
4 changes: 2 additions & 2 deletions Compression/REP/cels-rep.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ struct REP_METHOD : COMPRESSION_METHOD
char local_method [MAX_METHOD_STRLEN];
strncopy (local_method, method, sizeof (local_method));
split (local_method, COMPRESSION_METHOD_PARAMETERS_DELIMITER, parameters, MAX_PARAMETERS);
if (!strequ (parameters[0], "rep")) throw "rep:parse_method";
if (!strequ (parameters[0], "rep")) throw "REP_METHOD:parse_method";

// Åñëè íàçâàíèå ìåòîäà (íóëåâîé ïàðàìåòð) - "rep", òî ðàçáåð¸ì îñòàëüíûå ïàðàìåòðû
int error = 0; // Ïðèçíàê òîãî, ÷òî ïðè ðàçáîðå ïàðàìåòðîâ ïðîèçîøëà îøèáêà
Expand Down Expand Up @@ -141,6 +141,6 @@ int rep_server (TABI_ELEMENT* params)
}

// Register REP method in CELS
int rep_register = CELS_Register(rep_server);
//int rep_register = CELS_Register(rep_server);

}

0 comments on commit 28b39c6

Please sign in to comment.