mirror of
				https://github.com/facebook/zstd.git
				synced 2025-10-31 08:37:43 +02:00 
			
		
		
		
	support for legacy 0.3 format
This commit is contained in:
		| @@ -70,7 +70,8 @@ default: clean libzstd | |||||||
|  |  | ||||||
| all: clean libzstd | all: clean libzstd | ||||||
|  |  | ||||||
| libzstd: zstd_compress.c zstd_decompress.c huff0.c fse.c legacy/zstd_v01.c legacy/zstd_v02.c | libzstd: zstd_compress.c zstd_decompress.c huff0.c fse.c \  | ||||||
|  |          legacy/zstd_v01.c legacy/zstd_v02.c legacy/zstd_v03.c | ||||||
| 	@echo compiling static library | 	@echo compiling static library | ||||||
| 	@$(CC) $(FLAGS) -c $^ | 	@$(CC) $(FLAGS) -c $^ | ||||||
| 	@$(AR) rcs libzstd.a *.o | 	@$(AR) rcs libzstd.a *.o | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /* | /* | ||||||
|     zstd_v02 - decoder for 0.2 format |     zstd_legacy - decoder for legacy format | ||||||
|     Header File |     Header File | ||||||
|     Copyright (C) 2015, Yann Collet. |     Copyright (C) 2015, Yann Collet. | ||||||
|  |  | ||||||
| @@ -44,13 +44,15 @@ extern "C" { | |||||||
| #include "error.h"      /* ERROR */ | #include "error.h"      /* ERROR */ | ||||||
| #include "zstd_v01.h" | #include "zstd_v01.h" | ||||||
| #include "zstd_v02.h" | #include "zstd_v02.h" | ||||||
|  | #include "zstd_v03.h" | ||||||
|  |  | ||||||
| MEM_STATIC unsigned ZSTD_isLegacy (U32 magicNumberLE) | MEM_STATIC unsigned ZSTD_isLegacy (U32 magicNumberLE) | ||||||
| { | { | ||||||
| 	switch(magicNumberLE) | 	switch(magicNumberLE) | ||||||
| 	{ | 	{ | ||||||
| 		case ZSTDv01_magicNumberLE : | 		case ZSTDv01_magicNumberLE : | ||||||
| 		case ZSTDv02_magicNumber : return 1; | 		case ZSTDv02_magicNumber :  | ||||||
|  | 		case ZSTDv03_magicNumber : return 1; | ||||||
| 		default : return 0; | 		default : return 0; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| @@ -67,6 +69,8 @@ MEM_STATIC size_t ZSTD_decompressLegacy( | |||||||
| 			return ZSTDv01_decompress(dst, maxOriginalSize, src, compressedSize); | 			return ZSTDv01_decompress(dst, maxOriginalSize, src, compressedSize); | ||||||
| 		case ZSTDv02_magicNumber : | 		case ZSTDv02_magicNumber : | ||||||
| 			return ZSTDv02_decompress(dst, maxOriginalSize, src, compressedSize); | 			return ZSTDv02_decompress(dst, maxOriginalSize, src, compressedSize); | ||||||
|  | 		case ZSTDv03_magicNumber : | ||||||
|  | 			return ZSTDv03_decompress(dst, maxOriginalSize, src, compressedSize); | ||||||
| 		default : | 		default : | ||||||
| 		    return ERROR(prefix_unknown); | 		    return ERROR(prefix_unknown); | ||||||
| 	} | 	} | ||||||
|   | |||||||
							
								
								
									
										3730
									
								
								lib/legacy/zstd_v03.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3730
									
								
								lib/legacy/zstd_v03.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										99
									
								
								lib/legacy/zstd_v03.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								lib/legacy/zstd_v03.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,99 @@ | |||||||
|  | /* | ||||||
|  |     zstd_v03 - decoder for 0.3 format | ||||||
|  |     Header File | ||||||
|  |     Copyright (C) 2015, Yann Collet. | ||||||
|  |  | ||||||
|  |     BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) | ||||||
|  |  | ||||||
|  |     Redistribution and use in source and binary forms, with or without | ||||||
|  |     modification, are permitted provided that the following conditions are | ||||||
|  |     met: | ||||||
|  |     * Redistributions of source code must retain the above copyright | ||||||
|  |     notice, this list of conditions and the following disclaimer. | ||||||
|  |     * Redistributions in binary form must reproduce the above | ||||||
|  |     copyright notice, this list of conditions and the following disclaimer | ||||||
|  |     in the documentation and/or other materials provided with the | ||||||
|  |     distribution. | ||||||
|  |     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  |     "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  |     LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||||
|  |     A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||||
|  |     OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||||
|  |     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||||
|  |     LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||||
|  |     DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||||
|  |     THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||||
|  |     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||||
|  |     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  | ||||||
|  |     You can contact the author at : | ||||||
|  |     - zstd source repository : https://github.com/Cyan4973/zstd | ||||||
|  |     - ztsd public forum : https://groups.google.com/forum/#!forum/lz4c | ||||||
|  | */ | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #if defined (__cplusplus) | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* ************************************* | ||||||
|  | *  Includes | ||||||
|  | ***************************************/ | ||||||
|  | #include <stddef.h>   /* size_t */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* ************************************* | ||||||
|  | *  Simple one-step function | ||||||
|  | ***************************************/ | ||||||
|  | /** | ||||||
|  | ZSTDv03_decompress() : decompress ZSTD frames compliant with v0.3.x format | ||||||
|  |     compressedSize : is the exact source size | ||||||
|  |     maxOriginalSize : is the size of the 'dst' buffer, which must be already allocated. | ||||||
|  |                       It must be equal or larger than originalSize, otherwise decompression will fail. | ||||||
|  |     return : the number of bytes decompressed into destination buffer (originalSize) | ||||||
|  |              or an errorCode if it fails (which can be tested using ZSTDv01_isError()) | ||||||
|  | */ | ||||||
|  | size_t ZSTDv03_decompress( void* dst, size_t maxOriginalSize, | ||||||
|  |                      const void* src, size_t compressedSize); | ||||||
|  |  | ||||||
|  | /** | ||||||
|  | ZSTDv03_isError() : tells if the result of ZSTDv03_decompress() is an error | ||||||
|  | */ | ||||||
|  | unsigned ZSTDv03_isError(size_t code); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* ************************************* | ||||||
|  | *  Advanced functions | ||||||
|  | ***************************************/ | ||||||
|  | typedef struct ZSTDv03_Dctx_s ZSTDv03_Dctx; | ||||||
|  | ZSTDv03_Dctx* ZSTDv03_createDCtx(void); | ||||||
|  | size_t ZSTDv03_freeDCtx(ZSTDv03_Dctx* dctx); | ||||||
|  |  | ||||||
|  | size_t ZSTDv03_decompressDCtx(void* ctx, | ||||||
|  |                               void* dst, size_t maxOriginalSize, | ||||||
|  |                         const void* src, size_t compressedSize); | ||||||
|  |  | ||||||
|  | /* ************************************* | ||||||
|  | *  Streaming functions | ||||||
|  | ***************************************/ | ||||||
|  | size_t ZSTDv03_resetDCtx(ZSTDv03_Dctx* dctx); | ||||||
|  |  | ||||||
|  | size_t ZSTDv03_nextSrcSizeToDecompress(ZSTDv03_Dctx* dctx); | ||||||
|  | size_t ZSTDv03_decompressContinue(ZSTDv03_Dctx* dctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize); | ||||||
|  | /** | ||||||
|  |   Use above functions alternatively. | ||||||
|  |   ZSTD_nextSrcSizeToDecompress() tells how much bytes to provide as 'srcSize' to ZSTD_decompressContinue(). | ||||||
|  |   ZSTD_decompressContinue() will use previous data blocks to improve compression if they are located prior to current block. | ||||||
|  |   Result is the number of bytes regenerated within 'dst'. | ||||||
|  |   It can be zero, which is not an error; it just means ZSTD_decompressContinue() has decoded some header. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | /* ************************************* | ||||||
|  | *  Prefix - version detection | ||||||
|  | ***************************************/ | ||||||
|  | #define ZSTDv03_magicNumber 0xFD2FB523   /* v0.3 */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #if defined (__cplusplus) | ||||||
|  | } | ||||||
|  | #endif | ||||||
| @@ -62,48 +62,48 @@ default: zstd | |||||||
| all: zstd zstd32 fullbench fullbench32 fuzzer fuzzer32 zbufftest zbufftest32 paramgrill datagen | all: zstd zstd32 fullbench fullbench32 fuzzer fuzzer32 zbufftest zbufftest32 paramgrill datagen | ||||||
|  |  | ||||||
| zstd: $(ZSTDDIR)/zstd_compress.c $(ZSTDDIR)/zstd_decompress.c $(ZSTDDIR)/fse.c $(ZSTDDIR)/huff0.c $(ZSTDDIR)/zstd_buffered.c \ | zstd: $(ZSTDDIR)/zstd_compress.c $(ZSTDDIR)/zstd_decompress.c $(ZSTDDIR)/fse.c $(ZSTDDIR)/huff0.c $(ZSTDDIR)/zstd_buffered.c \ | ||||||
|       $(ZSTDDIR)/legacy/zstd_v01.c $(ZSTDDIR)/legacy/zstd_v02.c \ |       $(ZSTDDIR)/legacy/zstd_v01.c $(ZSTDDIR)/legacy/zstd_v02.c $(ZSTDDIR)/legacy/zstd_v03.c \ | ||||||
|       xxhash.c bench.c fileio.c zstdcli.c legacy/fileio_legacy.c |       xxhash.c bench.c fileio.c zstdcli.c legacy/fileio_legacy.c | ||||||
| 	$(CC)      $(FLAGS) $^ -o $@$(EXT) | 	$(CC)      $(FLAGS) $^ -o $@$(EXT) | ||||||
|  |  | ||||||
| zstd32: $(ZSTDDIR)/zstd_compress.c $(ZSTDDIR)/zstd_decompress.c $(ZSTDDIR)/fse.c $(ZSTDDIR)/huff0.c $(ZSTDDIR)/zstd_buffered.c \ | zstd32: $(ZSTDDIR)/zstd_compress.c $(ZSTDDIR)/zstd_decompress.c $(ZSTDDIR)/fse.c $(ZSTDDIR)/huff0.c $(ZSTDDIR)/zstd_buffered.c \ | ||||||
|       $(ZSTDDIR)/legacy/zstd_v01.c $(ZSTDDIR)/legacy/zstd_v02.c \ |       $(ZSTDDIR)/legacy/zstd_v01.c $(ZSTDDIR)/legacy/zstd_v02.c $(ZSTDDIR)/legacy/zstd_v03.c \ | ||||||
|       xxhash.c bench.c fileio.c zstdcli.c legacy/fileio_legacy.c |       xxhash.c bench.c fileio.c zstdcli.c legacy/fileio_legacy.c | ||||||
| 	$(CC) -m32 $(FLAGS) $^ -o $@$(EXT) | 	$(CC) -m32 $(FLAGS) $^ -o $@$(EXT) | ||||||
|  |  | ||||||
| fullbench  : $(ZSTDDIR)/zstd_compress.c $(ZSTDDIR)/zstd_decompress.c $(ZSTDDIR)/fse.c $(ZSTDDIR)/huff0.c \ | fullbench  : $(ZSTDDIR)/zstd_compress.c $(ZSTDDIR)/zstd_decompress.c $(ZSTDDIR)/fse.c $(ZSTDDIR)/huff0.c \ | ||||||
|       $(ZSTDDIR)/legacy/zstd_v01.c $(ZSTDDIR)/legacy/zstd_v02.c \ |       $(ZSTDDIR)/legacy/zstd_v01.c $(ZSTDDIR)/legacy/zstd_v02.c $(ZSTDDIR)/legacy/zstd_v03.c \ | ||||||
|       datagen.c fullbench.c |       datagen.c fullbench.c | ||||||
| 	$(CC)      $(FLAGS) $^ -o $@$(EXT) | 	$(CC)      $(FLAGS) $^ -o $@$(EXT) | ||||||
|  |  | ||||||
| fullbench32: $(ZSTDDIR)/zstd_compress.c $(ZSTDDIR)/zstd_decompress.c $(ZSTDDIR)/fse.c $(ZSTDDIR)/huff0.c \ | fullbench32: $(ZSTDDIR)/zstd_compress.c $(ZSTDDIR)/zstd_decompress.c $(ZSTDDIR)/fse.c $(ZSTDDIR)/huff0.c \ | ||||||
|       $(ZSTDDIR)/legacy/zstd_v01.c $(ZSTDDIR)/legacy/zstd_v02.c \ |       $(ZSTDDIR)/legacy/zstd_v01.c $(ZSTDDIR)/legacy/zstd_v02.c $(ZSTDDIR)/legacy/zstd_v03.c \ | ||||||
|       datagen.c fullbench.c |       datagen.c fullbench.c | ||||||
| 	$(CC) -m32 $(FLAGS) $^ -o $@$(EXT) | 	$(CC) -m32 $(FLAGS) $^ -o $@$(EXT) | ||||||
|  |  | ||||||
| fuzzer  : $(ZSTDDIR)/zstd_compress.c $(ZSTDDIR)/zstd_decompress.c $(ZSTDDIR)/fse.c $(ZSTDDIR)/huff0.c \ | fuzzer  : $(ZSTDDIR)/zstd_compress.c $(ZSTDDIR)/zstd_decompress.c $(ZSTDDIR)/fse.c $(ZSTDDIR)/huff0.c \ | ||||||
|       $(ZSTDDIR)/legacy/zstd_v01.c $(ZSTDDIR)/legacy/zstd_v02.c \ |       $(ZSTDDIR)/legacy/zstd_v01.c $(ZSTDDIR)/legacy/zstd_v02.c $(ZSTDDIR)/legacy/zstd_v03.c \ | ||||||
|       datagen.c xxhash.c fuzzer.c |       datagen.c xxhash.c fuzzer.c | ||||||
| 	$(CC)      $(FLAGS) $^ -o $@$(EXT) | 	$(CC)      $(FLAGS) $^ -o $@$(EXT) | ||||||
|  |  | ||||||
| fuzzer32: $(ZSTDDIR)/zstd_compress.c $(ZSTDDIR)/zstd_decompress.c $(ZSTDDIR)/fse.c $(ZSTDDIR)/huff0.c \ | fuzzer32: $(ZSTDDIR)/zstd_compress.c $(ZSTDDIR)/zstd_decompress.c $(ZSTDDIR)/fse.c $(ZSTDDIR)/huff0.c \ | ||||||
|       $(ZSTDDIR)/legacy/zstd_v01.c $(ZSTDDIR)/legacy/zstd_v02.c \ |       $(ZSTDDIR)/legacy/zstd_v01.c $(ZSTDDIR)/legacy/zstd_v02.c $(ZSTDDIR)/legacy/zstd_v03.c \ | ||||||
|       datagen.c xxhash.c fuzzer.c |       datagen.c xxhash.c fuzzer.c | ||||||
| 	$(CC) -m32 $(FLAGS) $^ -o $@$(EXT) | 	$(CC) -m32 $(FLAGS) $^ -o $@$(EXT) | ||||||
|  |  | ||||||
| zbufftest  : $(ZSTDDIR)/zstd_compress.c $(ZSTDDIR)/zstd_decompress.c $(ZSTDDIR)/zstd_buffered.c $(ZSTDDIR)/fse.c $(ZSTDDIR)/huff0.c \ | zbufftest  : $(ZSTDDIR)/zstd_compress.c $(ZSTDDIR)/zstd_decompress.c $(ZSTDDIR)/zstd_buffered.c $(ZSTDDIR)/fse.c $(ZSTDDIR)/huff0.c \ | ||||||
|       $(ZSTDDIR)/legacy/zstd_v01.c $(ZSTDDIR)/legacy/zstd_v02.c \ |       $(ZSTDDIR)/legacy/zstd_v01.c $(ZSTDDIR)/legacy/zstd_v02.c $(ZSTDDIR)/legacy/zstd_v03.c \ | ||||||
|       datagen.c xxhash.c zbufftest.c |       datagen.c xxhash.c zbufftest.c | ||||||
| 	$(CC)      $(FLAGS) $^ -o $@$(EXT) | 	$(CC)      $(FLAGS) $^ -o $@$(EXT) | ||||||
|  |  | ||||||
| zbufftest32: $(ZSTDDIR)/zstd_compress.c $(ZSTDDIR)/zstd_decompress.c $(ZSTDDIR)/zstd_buffered.c $(ZSTDDIR)/fse.c $(ZSTDDIR)/huff0.c \ | zbufftest32: $(ZSTDDIR)/zstd_compress.c $(ZSTDDIR)/zstd_decompress.c $(ZSTDDIR)/zstd_buffered.c $(ZSTDDIR)/fse.c $(ZSTDDIR)/huff0.c \ | ||||||
|       $(ZSTDDIR)/legacy/zstd_v01.c $(ZSTDDIR)/legacy/zstd_v02.c \ |       $(ZSTDDIR)/legacy/zstd_v01.c $(ZSTDDIR)/legacy/zstd_v02.c $(ZSTDDIR)/legacy/zstd_v03.c \ | ||||||
|       datagen.c xxhash.c zbufftest.c |       datagen.c xxhash.c zbufftest.c | ||||||
| 	$(CC) -m32 $(FLAGS) $^ -o $@$(EXT) | 	$(CC) -m32 $(FLAGS) $^ -o $@$(EXT) | ||||||
|  |  | ||||||
| paramgrill : $(ZSTDDIR)/zstd_compress.c $(ZSTDDIR)/zstd_decompress.c $(ZSTDDIR)/fse.c $(ZSTDDIR)/huff0.c \ | paramgrill : $(ZSTDDIR)/zstd_compress.c $(ZSTDDIR)/zstd_decompress.c $(ZSTDDIR)/fse.c $(ZSTDDIR)/huff0.c \ | ||||||
|              $(ZSTDDIR)/legacy/zstd_v01.c $(ZSTDDIR)/legacy/zstd_v02.c \ |       $(ZSTDDIR)/legacy/zstd_v01.c $(ZSTDDIR)/legacy/zstd_v02.c $(ZSTDDIR)/legacy/zstd_v03.c \ | ||||||
|              datagen.c xxhash.c paramgrill.c |       datagen.c xxhash.c paramgrill.c | ||||||
| 	$(CC)      $(FLAGS) $^ -lm -o $@$(EXT) | 	$(CC)      $(FLAGS) $^ -lm -o $@$(EXT) | ||||||
|  |  | ||||||
| datagen : datagen.c datagencli.c | datagen : datagen.c datagencli.c | ||||||
|   | |||||||
| @@ -222,7 +222,6 @@ unsigned long long FIOv02_decompressFrame(FILE* foutput, FILE* finput) | |||||||
|     size_t sizeCheck; |     size_t sizeCheck; | ||||||
|     ZSTDv02_Dctx* dctx = ZSTDv02_createDCtx(); |     ZSTDv02_Dctx* dctx = ZSTDv02_createDCtx(); | ||||||
|  |  | ||||||
|  |  | ||||||
|     /* init */ |     /* init */ | ||||||
|     if (outBuff==NULL) EXM_THROW(41, "Error : not enough memory to decode legacy frame"); |     if (outBuff==NULL) EXM_THROW(41, "Error : not enough memory to decode legacy frame"); | ||||||
|  |  | ||||||
| @@ -246,7 +245,7 @@ unsigned long long FIOv02_decompressFrame(FILE* foutput, FILE* finput) | |||||||
|  |  | ||||||
|         /* Decode block */ |         /* Decode block */ | ||||||
|         decodedSize = ZSTDv02_decompressContinue(dctx, op, oend-op, inBuff, readSize); |         decodedSize = ZSTDv02_decompressContinue(dctx, op, oend-op, inBuff, readSize); | ||||||
|         if (ZSTDv01_isError(decodedSize)) EXM_THROW(45, "Decoding error : input corrupted"); |         if (ZSTDv02_isError(decodedSize)) EXM_THROW(45, "Decoding error : input corrupted"); | ||||||
|  |  | ||||||
|         if (decodedSize)   /* not a header */ |         if (decodedSize)   /* not a header */ | ||||||
|         { |         { | ||||||
| @@ -270,6 +269,66 @@ unsigned long long FIOv02_decompressFrame(FILE* foutput, FILE* finput) | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | unsigned long long FIOv03_decompressFrame(FILE* foutput, FILE* finput) | ||||||
|  | { | ||||||
|  |     size_t outBuffSize = 512 KB; | ||||||
|  |     BYTE* outBuff = (BYTE*)malloc(outBuffSize); | ||||||
|  |     size_t inBuffSize = 128 KB + 8; | ||||||
|  |     BYTE inBuff[128 KB + 8]; | ||||||
|  |     BYTE* op = outBuff; | ||||||
|  |     BYTE* const oend = outBuff + outBuffSize; | ||||||
|  |     U64   filesize = 0; | ||||||
|  |     size_t toRead; | ||||||
|  |     size_t sizeCheck; | ||||||
|  |     ZSTDv03_Dctx* dctx = ZSTDv03_createDCtx(); | ||||||
|  |  | ||||||
|  |     /* init */ | ||||||
|  |     if (outBuff==NULL) EXM_THROW(41, "Error : not enough memory to decode legacy frame"); | ||||||
|  |  | ||||||
|  |     /* restore header, already read from input */ | ||||||
|  |     MEM_writeLE32(inBuff, ZSTDv03_magicNumber); | ||||||
|  |     sizeCheck = ZSTDv03_decompressContinue(dctx, NULL, 0, inBuff, sizeof(ZSTDv03_magicNumber));   /* Decode frame header */ | ||||||
|  |     if (ZSTDv03_isError(sizeCheck)) EXM_THROW(42, "Error decoding legacy header"); | ||||||
|  |  | ||||||
|  |     /* Main decompression Loop */ | ||||||
|  |     toRead = ZSTDv03_nextSrcSizeToDecompress(dctx); | ||||||
|  |     while (toRead) | ||||||
|  |     { | ||||||
|  |         size_t readSize, decodedSize; | ||||||
|  |  | ||||||
|  |         /* Fill input buffer */ | ||||||
|  |         if (toRead > inBuffSize) | ||||||
|  |             EXM_THROW(43, "too large block"); | ||||||
|  |         readSize = fread(inBuff, 1, toRead, finput); | ||||||
|  |         if (readSize != toRead) | ||||||
|  |             EXM_THROW(44, "Read error"); | ||||||
|  |  | ||||||
|  |         /* Decode block */ | ||||||
|  |         decodedSize = ZSTDv03_decompressContinue(dctx, op, oend-op, inBuff, readSize); | ||||||
|  |         if (ZSTDv03_isError(decodedSize)) EXM_THROW(45, "Decoding error : input corrupted"); | ||||||
|  |  | ||||||
|  |         if (decodedSize)   /* not a header */ | ||||||
|  |         { | ||||||
|  |             /* Write block */ | ||||||
|  |             sizeCheck = fwrite(op, 1, decodedSize, foutput); | ||||||
|  |             if (sizeCheck != decodedSize) EXM_THROW(46, "Write error : unable to write data block to destination file"); | ||||||
|  |             filesize += decodedSize; | ||||||
|  |             op += decodedSize; | ||||||
|  |             if (op==oend) op = outBuff; | ||||||
|  |             DISPLAYUPDATE(2, "\rDecoded : %u MB...     ", (U32)(filesize>>20) ); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /* prepare for next Block */ | ||||||
|  |         toRead = ZSTDv03_nextSrcSizeToDecompress(dctx); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /* release resources */ | ||||||
|  |     free(outBuff); | ||||||
|  |     free(dctx); | ||||||
|  |     return filesize; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| unsigned long long FIO_decompressLegacyFrame(FILE* foutput, FILE* finput, U32 magicNumberLE) | unsigned long long FIO_decompressLegacyFrame(FILE* foutput, FILE* finput, U32 magicNumberLE) | ||||||
| { | { | ||||||
| 	switch(magicNumberLE) | 	switch(magicNumberLE) | ||||||
| @@ -278,6 +337,8 @@ unsigned long long FIO_decompressLegacyFrame(FILE* foutput, FILE* finput, U32 ma | |||||||
| 			return FIOv01_decompressFrame(foutput, finput); | 			return FIOv01_decompressFrame(foutput, finput); | ||||||
| 		case ZSTDv02_magicNumber : | 		case ZSTDv02_magicNumber : | ||||||
| 			return FIOv02_decompressFrame(foutput, finput); | 			return FIOv02_decompressFrame(foutput, finput); | ||||||
|  | 		case ZSTDv03_magicNumber : | ||||||
|  | 			return FIOv03_decompressFrame(foutput, finput); | ||||||
| 		default : | 		default : | ||||||
| 		    return ERROR(prefix_unknown); | 		    return ERROR(prefix_unknown); | ||||||
| 	} | 	} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user