22
33#include "compress.h"
44
5+ #include "savestate.h"
56#include "bool.h"
67#include "libc/string.h"
78
@@ -62,7 +63,7 @@ typedef struct
6263
6364static MinMatcHash hashMinMatch (MinMatch match )
6465{
65- return (MinMatcHash ){((match .match3 * 506832829U ) << 8 ) >> (32 - HASH_CHAINS_BITS ), (match .match4 * 2654435761U ) >> (32 - HASH_CHAINS_BITS )};
66+ return (MinMatcHash ){((match .match3 * 506832829U )) >> (32 - HASH_CHAINS_BITS ), (match .match4 * 2654435761U ) >> (32 - HASH_CHAINS_BITS )};
6667}
6768
6869static void wildCopy4 (uint8_t * dst , const uint8_t * src , const uint8_t * dstEnd )
@@ -132,7 +133,7 @@ static MinMatchPtr tryMinMatch(uint32_t potentialMinMatchOffset, MinMatch minMat
132133 }
133134}
134135
135- void mlz4_compress (const uint8_t * in , const uint32_t inSize , uint8_t * out , uint32_t * outSize )
136+ uint32_t mlz4_compress (const uint8_t * in , const uint32_t inSize , uint8_t * out )
136137{
137138 uint8_t * compressedData = out ;
138139
@@ -142,23 +143,25 @@ void mlz4_compress(const uint8_t *in, const uint32_t inSize, uint8_t *out, uint3
142143 uint8_t hashChains4 [HASH_CHAINS_SIZE ] = {};
143144#else
144145 // placed in gDecompressionHeap
145- uint8_t * hashChains3 = (uint8_t * )0x801c1000 ;
146- uint8_t * hashChains4 = (uint8_t * )0x801c1000 + HASH_CHAINS_SIZE ;
146+ uint8_t * hashChains3 = Hacktice_gState -> memory + MaxStateSize - HASH_CHAINS_SIZE * 2 - 0xf00 ;
147+ uint8_t * hashChains4 = hashChains3 + HASH_CHAINS_SIZE ;
148+ bzero (hashChains3 , 2 * HASH_CHAINS_SIZE );
147149#endif
148150
149151 // should be safe to do
150- * ( uint32_t * ) outCursor = inSize ;
152+ PUT_UNALIGNED4 ( inSize , outCursor ) ;
151153 outCursor += 4 ;
152154
155+ #if 0
153156 // uncompressible data, just write it out as literals
154157 if (inSize <= 8 )
155158 {
156159 outCursor [0 ] = ((uint8_t )inSize ) << 4 ;
157160 outCursor ++ ;
158161 WILD_COPY_MOVE (outCursor , in , inSize );
159- * outSize = (size_t )(outCursor - compressedData );
160- return ;
162+ return (uint32_t ) (outCursor - compressedData );
161163 }
164+ #endif
162165
163166 const uint8_t * inEnd = in + inSize ;
164167 const uint8_t * inCursor = in + 4 ;
@@ -192,8 +195,7 @@ void mlz4_compress(const uint8_t *in, const uint32_t inSize, uint8_t *out, uint3
192195 }
193196
194197 WILD_COPY_MOVE (outCursor , inLiteralStart , literalsCount );
195- * outSize = (uint32_t )(outCursor - compressedData );
196- return ;
198+ return (uint32_t )(outCursor - compressedData );
197199 }
198200
199201 MinMatch minMatch = readMinMatch (inCursor );
@@ -247,10 +249,10 @@ void mlz4_compress(const uint8_t *in, const uint32_t inSize, uint8_t *out, uint3
247249 }
248250}
249251
250- void mlz4_decompress (const uint8_t * in , uint8_t * out )
252+ uint32_t mlz4_decompress (const uint8_t * in , uint8_t * out )
251253{
252254 const uint8_t * inCursor = in ;
253- uint32_t originalSize = * ( uint32_t * ) inCursor ;
255+ uint32_t originalSize = GET_UNALIGNED4 ( inCursor ) ;
254256 inCursor += 4 ;
255257
256258 uint8_t * outCursor = out ;
@@ -279,6 +281,7 @@ void mlz4_decompress(const uint8_t *in, uint8_t *out)
279281 // last 4 literals must be in safety margin
280282 memcpy (outCursor , inCursor , literalsCount );
281283 outCursor += literalsCount ;
284+ inCursor += literalsCount ;
282285 break ;
283286 }
284287 else
@@ -306,4 +309,7 @@ void mlz4_decompress(const uint8_t *in, uint8_t *out)
306309 const uint8_t * matchStart = outCursor - offset ;
307310 WILD_COPY_MOVE (outCursor , matchStart , matchesCount );
308311 }
312+
313+ // TODO: this is incredibly ugly, rework this mess
314+ return inCursor - in ;
309315}
0 commit comments