From: Yann Collet Date: Wed, 3 Feb 2016 11:06:24 +0000 (+0100) Subject: Updated error API, following suggestions by @nemequ (#116) X-Git-Tag: v0.5.0~1^2~3^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=72bff50ecf690245437b409f4bdfb8b0c712610a;p=thirdparty%2Fzstd.git Updated error API, following suggestions by @nemequ (#116) --- diff --git a/lib/error_private.h b/lib/error_private.h index 8cb0b8768..0e768643f 100644 --- a/lib/error_private.h +++ b/lib/error_private.h @@ -40,14 +40,14 @@ extern "C" { #endif -/* ***************************************** -* Includes +/* **************************************** +* Dependencies ******************************************/ -#include /* size_t, ptrdiff_t */ +#include /* size_t */ #include "error_public.h" /* enum list */ -/* ***************************************** +/* **************************************** * Compiler-specific ******************************************/ #if defined(__GNUC__) @@ -61,44 +61,52 @@ extern "C" { #endif -/* ***************************************** -* Error Codes +/*-**************************************** +* Customization ******************************************/ +typedef ZSTD_errorCode ERR_enum; #define PREFIX(name) ZSTD_error_##name + +/*-**************************************** +* Error codes handling +******************************************/ #ifdef ERROR -# undef ERROR /* reported already defined on VS 2015 by Rich Geldreich */ +# undef ERROR /* reported already defined on VS 2015 (Rich Geldreich) */ #endif #define ERROR(name) (size_t)-PREFIX(name) ERR_STATIC unsigned ERR_isError(size_t code) { return (code > ERROR(maxCode)); } +ERR_STATIC ERR_enum ERR_getError(size_t code) { if (!ERR_isError(code)) return (ERR_enum)0; return (ERR_enum) (0-code); } + -/* ***************************************** +/*-**************************************** * Error Strings ******************************************/ ERR_STATIC const char* ERR_getErrorName(size_t code) { - static const char* codeError = "Unspecified error code"; - switch( (size_t)(0-code) ) + static const char* notErrorCode = "Unspecified error code"; + switch( ERR_getError(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_dictionary_corrupted: return "Dictionary is corrupted"; - case ZSTD_error_maxCode: - default: return codeError; + case PREFIX(no_error): return "No error detected"; + case PREFIX(GENERIC): return "Error (generic)"; + case PREFIX(prefix_unknown): return "Unknown frame descriptor"; + case PREFIX(frameParameter_unsupported): return "Unsupported frame parameter"; + case PREFIX(frameParameter_unsupportedBy32bits): return "Frame parameter unsupported in 32-bits mode"; + case PREFIX(init_missing): return "Context should be init first"; + case PREFIX(memory_allocation): return "Allocation error : not enough memory"; + case PREFIX(stage_wrong): return "Operation not authorized at current processing stage"; + case PREFIX(dstSize_tooSmall): return "Destination buffer is too small"; + case PREFIX(srcSize_wrong): return "Src size incorrect"; + case PREFIX(corruption_detected): return "Corrupted block detected"; + case PREFIX(tableLog_tooLarge): return "tableLog requires too much memory"; + case PREFIX(maxSymbolValue_tooLarge): return "Unsupported max possible Symbol Value : too large"; + case PREFIX(maxSymbolValue_tooSmall): return "Specified maxSymbolValue is too small"; + case PREFIX(dictionary_corrupted): return "Dictionary is corrupted"; + case PREFIX(maxCode): + default: return notErrorCode; /* should be impossible, due to ERR_getError() */ } } diff --git a/lib/error_public.h b/lib/error_public.h index ceb5a5922..8102f9dfa 100644 --- a/lib/error_public.h +++ b/lib/error_public.h @@ -39,14 +39,14 @@ extern "C" { /* **************************************** -* error list +* error codes list ******************************************/ -enum { - ZSTD_error_No_Error, +typedef enum { + ZSTD_error_no_error, ZSTD_error_GENERIC, ZSTD_error_prefix_unknown, ZSTD_error_frameParameter_unsupported, - ZSTD_error_frameParameter_unsupportedBy32bitsImplementation, + ZSTD_error_frameParameter_unsupportedBy32bits, ZSTD_error_init_missing, ZSTD_error_memory_allocation, ZSTD_error_stage_wrong, @@ -58,7 +58,7 @@ enum { ZSTD_error_maxSymbolValue_tooSmall, ZSTD_error_dictionary_corrupted, ZSTD_error_maxCode -}; +} ZSTD_errorCode; /* note : functions provide error codes in reverse negative order, so compare with (size_t)(0-enum) */ diff --git a/lib/zstd_decompress.c b/lib/zstd_decompress.c index 1a724489f..ce969a454 100644 --- a/lib/zstd_decompress.c +++ b/lib/zstd_decompress.c @@ -109,6 +109,10 @@ unsigned ZSTD_versionNumber (void) { return ZSTD_VERSION_NUMBER; } * tells if a return value is an error code */ unsigned ZSTD_isError(size_t code) { return ERR_isError(code); } +/*! ZSTD_getError +* convert a `size_t` function result into a proper ZSTD_errorCode enum */ +ZSTD_errorCode ZSTD_getError(size_t code) { return ERR_getError(code); } + /*! ZSTD_getErrorName * provides error code string (useful for debugging) */ const char* ZSTD_getErrorName(size_t code) { return ERR_getErrorName(code); } @@ -302,7 +306,7 @@ static size_t ZSTD_decodeFrameHeader_Part2(ZSTD_DCtx* zc, const void* src, size_ if (srcSize != zc->headerSize) return ERROR(srcSize_wrong); result = ZSTD_getFrameParams(&(zc->params), src, srcSize); - if ((MEM_32bits()) && (zc->params.windowLog > 25)) return ERROR(frameParameter_unsupportedBy32bitsImplementation); + if ((MEM_32bits()) && (zc->params.windowLog > 25)) return ERROR(frameParameter_unsupportedBy32bits); return result; } diff --git a/lib/zstd_static.h b/lib/zstd_static.h index 49a5e3dee..4a36f1e8a 100644 --- a/lib/zstd_static.h +++ b/lib/zstd_static.h @@ -229,6 +229,10 @@ size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, cons * Error management ***************************************/ #include "error_public.h" +/*! ZSTD_getErrorCode + transform a function result using `size_t` into a `ZSTD_error_code` enum type + which can be used to compare directly with enum list within "error_public.h" */ +ZSTD_errorCode ZSTD_getError(size_t code); #if defined (__cplusplus)