diff --git a/lib/bitstream.h b/lib/bitstream.h index dcfe8b0a..fbd0f3f3 100644 --- a/lib/bitstream.h +++ b/lib/bitstream.h @@ -50,8 +50,8 @@ extern "C" { /****************************************** * Includes ******************************************/ -#include "mem.h" /* unaligned access routines */ -#include "error.h" /* error codes and messages */ +#include "mem.h" /* unaligned access routines */ +#include "error_private.h" /* error codes and messages */ /******************************************** diff --git a/lib/error.h b/lib/error_private.h similarity index 58% rename from lib/error.h rename to lib/error_private.h index 2ec64d0c..dbb202f4 100644 --- a/lib/error.h +++ b/lib/error_private.h @@ -1,6 +1,6 @@ /* ****************************************************************** Error codes and messages - Copyright (C) 2013-2015, Yann Collet + Copyright (C) 2013-2016, Yann Collet BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) @@ -28,9 +28,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. You can contact the author at : - - Source repository : https://github.com/Cyan4973/FiniteStateEntropy - - Public forum : https://groups.google.com/forum/#!forum/lz4c + - Source repository : https://github.com/Cyan4973/zstd ****************************************************************** */ +/* Note : this module is expected to remain private, do not expose it */ + #ifndef ERROR_H_MODULE #define ERROR_H_MODULE @@ -39,28 +40,29 @@ extern "C" { #endif -/****************************************** +/* ***************************************** * Includes ******************************************/ -#include /* size_t, ptrdiff_t */ +#include /* size_t, ptrdiff_t */ +#include "error_public.h" /* enum list */ -/****************************************** +/* ***************************************** * Compiler-specific ******************************************/ -#if defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) +#if defined(__GNUC__) +# define ERR_STATIC static __attribute__((unused)) +#elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) # define ERR_STATIC static inline #elif defined(_MSC_VER) # define ERR_STATIC static __inline -#elif defined(__GNUC__) -# define ERR_STATIC static __attribute__((unused)) #else # define ERR_STATIC static /* this version may generate warnings for unused static functions; disable the relevant warning */ #endif -/****************************************** -* Error Management +/* ***************************************** +* Error Codes ******************************************/ #define PREFIX(name) ZSTD_error_##name @@ -69,29 +71,34 @@ extern "C" { #endif #define ERROR(name) (size_t)-PREFIX(name) -#define ERROR_LIST(ITEM) \ - ITEM(PREFIX(No_Error)) ITEM(PREFIX(GENERIC)) \ - ITEM(PREFIX(prefix_unknown)) ITEM(PREFIX(frameParameter_unsupported)) ITEM(PREFIX(frameParameter_unsupportedBy32bitsImplementation)) \ - ITEM(PREFIX(init_missing)) ITEM(PREFIX(memory_allocation)) ITEM(PREFIX(stage_wrong)) \ - ITEM(PREFIX(dstSize_tooSmall)) ITEM(PREFIX(srcSize_wrong)) \ - ITEM(PREFIX(corruption_detected)) \ - ITEM(PREFIX(tableLog_tooLarge)) ITEM(PREFIX(maxSymbolValue_tooLarge)) ITEM(PREFIX(maxSymbolValue_tooSmall)) \ - ITEM(PREFIX(maxCode)) - -#define ERROR_GENERATE_ENUM(ENUM) ENUM, -typedef enum { ERROR_LIST(ERROR_GENERATE_ENUM) } ERR_codes; /* enum is exposed, to detect & handle specific errors; compare function result to -enum value */ - -#define ERROR_CONVERTTOSTRING(STRING) #STRING, -#define ERROR_GENERATE_STRING(EXPR) ERROR_CONVERTTOSTRING(EXPR) -static const char* ERR_strings[] = { ERROR_LIST(ERROR_GENERATE_STRING) }; - ERR_STATIC unsigned ERR_isError(size_t code) { return (code > ERROR(maxCode)); } + +/* ***************************************** +* Error Strings +******************************************/ + ERR_STATIC const char* ERR_getErrorName(size_t code) { static const char* codeError = "Unspecified error code"; - if (ERR_isError(code)) return ERR_strings[-(int)(code)]; - return codeError; + switch( (size_t)-code ) + { + case ZSTD_error_No_Error: return "No error detected"; + case ZSTD_error_GENERIC: return "Error (generic)"; + case ZSTD_error_prefix_unknown: return "Unknown frame descriptor"; + case ZSTD_error_frameParameter_unsupported: return "Unsupported frame parameter"; + case ZSTD_error_frameParameter_unsupportedBy32bitsImplementation: return "Frame parameter unsupported in 32-bits mode"; + case ZSTD_error_init_missing: return "Context should be init first"; + case ZSTD_error_memory_allocation: return "Allocation error : not enough memory"; + case ZSTD_error_dstSize_tooSmall: return "Destination buffer is too small"; + case ZSTD_error_srcSize_wrong: return "Src size incorrect"; + case ZSTD_error_corruption_detected: return "Corrupted block detected"; + case ZSTD_error_tableLog_tooLarge: return "tableLog requires too much memory"; + case ZSTD_error_maxSymbolValue_tooLarge: return "Unsupported max possible Symbol Value : too large"; + case ZSTD_error_maxSymbolValue_tooSmall: return "Specified maxSymbolValue is too small"; + case ZSTD_error_maxCode: + default: return codeError; + } } diff --git a/lib/error_public.h b/lib/error_public.h new file mode 100644 index 00000000..a07d00ce --- /dev/null +++ b/lib/error_public.h @@ -0,0 +1,69 @@ +/* ****************************************************************** + Error codes list + Copyright (C) 2016, 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 : + - Source repository : https://github.com/Cyan4973/zstd +****************************************************************** */ +#ifndef ERROR_PUBLIC_H_MODULE +#define ERROR_PUBLIC_H_MODULE + +#if defined (__cplusplus) +extern "C" { +#endif + + +/* **************************************** +* error list +******************************************/ +enum { + ZSTD_error_No_Error, + ZSTD_error_GENERIC, + ZSTD_error_prefix_unknown, + ZSTD_error_frameParameter_unsupported, + ZSTD_error_frameParameter_unsupportedBy32bitsImplementation, + ZSTD_error_init_missing, + ZSTD_error_memory_allocation, + ZSTD_error_stage_wrong, + ZSTD_error_dstSize_tooSmall, + ZSTD_error_srcSize_wrong, + ZSTD_error_corruption_detected, + ZSTD_error_tableLog_tooLarge, + ZSTD_error_maxSymbolValue_tooLarge, + ZSTD_error_maxSymbolValue_tooSmall, + ZSTD_error_maxCode +}; + +/* note : functions provide error codes are provided as (size_t)-enum */ + + +#if defined (__cplusplus) +} +#endif + +#endif /* ERROR_PUBLIC_H_MODULE */ diff --git a/lib/zstd_buffered.c b/lib/zstd_buffered.c index 8a7fa1d1..48721d62 100644 --- a/lib/zstd_buffered.c +++ b/lib/zstd_buffered.c @@ -39,7 +39,7 @@ * Includes ***************************************/ #include -#include "error.h" +#include "error_private.h" #include "zstd_static.h" #include "zstd_buffered_static.h" @@ -243,6 +243,8 @@ static size_t ZBUFF_compressContinue_generic(ZBUFF_CCtx* zbc, zbc->stage = ZBUFFcs_load; break; } + default: + return ERROR(GENERIC); /* impossible */ } } @@ -534,6 +536,7 @@ size_t ZBUFF_decompressContinue(ZBUFF_DCtx* zbc, void* dst, size_t* maxDstSizePt notDone = 0; break; } + default: return ERROR(GENERIC); /* impossible */ } } diff --git a/lib/zstd_internal.h b/lib/zstd_internal.h index bddfc929..cae2cb8f 100644 --- a/lib/zstd_internal.h +++ b/lib/zstd_internal.h @@ -41,7 +41,7 @@ extern "C" { * Includes ***************************************/ #include "mem.h" -#include "error.h" +#include "error_private.h" /* ************************************* diff --git a/lib/zstd_static.h b/lib/zstd_static.h index a98cfead..c60fa65c 100644 --- a/lib/zstd_static.h +++ b/lib/zstd_static.h @@ -334,7 +334,7 @@ static const ZSTD_parameters ZSTD_defaultParameters[4][ZSTD_MAX_CLEVEL+1] = { /* ************************************* * Error management ***************************************/ -#include "error.h" +#include "error_public.h" #if defined (__cplusplus) diff --git a/programs/Makefile b/programs/Makefile index 182f91a3..c64cbe6b 100644 --- a/programs/Makefile +++ b/programs/Makefile @@ -45,7 +45,7 @@ DESTDIR?= PREFIX ?= /usr/local CPPFLAGS= -I../lib -DZSTD_VERSION=\"$(VERSION)\" CFLAGS ?= -O3 # -falign-loops=32 # not always beneficial -CFLAGS += -std=c99 -Wall -Wextra -Wundef -Wshadow -Wcast-qual -Wcast-align -Wstrict-prototypes -Wstrict-aliasing=1 +CFLAGS += -std=c99 -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow -Wstrict-aliasing=1 -Wswitch-enum -Wstrict-prototypes -Wundef FLAGS = $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(MOREFLAGS) BINDIR = $(PREFIX)/bin diff --git a/programs/fuzzer.c b/programs/fuzzer.c index 9c427c20..4058ef24 100644 --- a/programs/fuzzer.c +++ b/programs/fuzzer.c @@ -185,13 +185,13 @@ static int basicUnitTests(U32 seed, double compressibility) DISPLAYLEVEL(4, "test%3i : decompress with 1 missing byte : ", testNb++); result = ZSTD_decompress(decodedBuffer, COMPRESSIBLE_NOISE_LENGTH, compressedBuffer, cSize-1); if (!ZSTD_isError(result)) goto _output_error; - if (result != ERROR(srcSize_wrong)) goto _output_error; + if (result != (size_t)-ZSTD_error_srcSize_wrong) goto _output_error; DISPLAYLEVEL(4, "OK \n"); DISPLAYLEVEL(4, "test%3i : decompress with 1 too much byte : ", testNb++); result = ZSTD_decompress(decodedBuffer, COMPRESSIBLE_NOISE_LENGTH, compressedBuffer, cSize+1); if (!ZSTD_isError(result)) goto _output_error; - if (result != ERROR(srcSize_wrong)) goto _output_error; + if (result != (size_t)-ZSTD_error_srcSize_wrong) goto _output_error; DISPLAYLEVEL(4, "OK \n"); /* Dictionary and Duplication tests */ @@ -259,7 +259,7 @@ static int basicUnitTests(U32 seed, double compressibility) DISPLAYLEVEL(4, "test%3i : Check input length for magic number : ", testNb++); result = ZSTD_decompress(decodedBuffer, COMPRESSIBLE_NOISE_LENGTH, CNBuffer, 3); if (!ZSTD_isError(result)) goto _output_error; - if (result != ERROR(srcSize_wrong)) goto _output_error; + if (result != (size_t)-ZSTD_error_srcSize_wrong) goto _output_error; DISPLAYLEVEL(4, "OK \n"); DISPLAYLEVEL(4, "test%3i : Check magic Number : ", testNb++);