]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
Updated error API, following suggestions by @nemequ (#116)
authorYann Collet <yann.collet.73@gmail.com>
Wed, 3 Feb 2016 11:06:24 +0000 (12:06 +0100)
committerYann Collet <yann.collet.73@gmail.com>
Wed, 3 Feb 2016 11:06:24 +0000 (12:06 +0100)
lib/error_private.h
lib/error_public.h
lib/zstd_decompress.c
lib/zstd_static.h

index 8cb0b87689424c6c7c86230b5bd2b827f01702cf..0e768643f9a694e57244989ac0e22d54b34527b3 100644 (file)
@@ -40,14 +40,14 @@ extern "C" {
 #endif
 
 
-/* *****************************************
-*  Includes
+/* ****************************************
+*  Dependencies
 ******************************************/
-#include <stddef.h>        /* size_t, ptrdiff_t */
+#include <stddef.h>        /* 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() */
     }
 }
 
index ceb5a5922a2e6cea91e9cca9adb43d1532c58c3b..8102f9dfa81c0ecd1183b12e6fdc0006b8cecc08 100644 (file)
@@ -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) */
index 1a724489f7577d25e2ab46cf968cd5ab24ff3c45..ce969a4542c9a3120c030d9eeac8a7551f2786ea 100644 (file)
@@ -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;
 }
 
index 49a5e3deea5d8a2bebc0d607b3c8b9331a133e4f..4a36f1e8ad56d19e97a30951646844fd4bb30708 100644 (file)
@@ -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)