|  | /* | 
|  | * Copyright (c) Yann Collet, Facebook, Inc. | 
|  | * All rights reserved. | 
|  | * | 
|  | * This source code is licensed under both the BSD-style license (found in the | 
|  | * LICENSE file in the root directory of this source tree) and the GPLv2 (found | 
|  | * in the COPYING file in the root directory of this source tree). | 
|  | * You may select, at your option, one of the above-listed licenses. | 
|  | */ | 
|  |  | 
|  |  | 
|  |  | 
|  | /*-************************************* | 
|  | *  Dependencies | 
|  | ***************************************/ | 
|  | #define ZSTD_DEPS_NEED_MALLOC | 
|  | #include "zstd_deps.h"   /* ZSTD_malloc, ZSTD_calloc, ZSTD_free, ZSTD_memset */ | 
|  | #include "error_private.h" | 
|  | #include "zstd_internal.h" | 
|  |  | 
|  |  | 
|  | /*-**************************************** | 
|  | *  Version | 
|  | ******************************************/ | 
|  | unsigned ZSTD_versionNumber(void) { return ZSTD_VERSION_NUMBER; } | 
|  |  | 
|  | const char* ZSTD_versionString(void) { return ZSTD_VERSION_STRING; } | 
|  |  | 
|  |  | 
|  | /*-**************************************** | 
|  | *  ZSTD Error Management | 
|  | ******************************************/ | 
|  | #undef ZSTD_isError   /* defined within zstd_internal.h */ | 
|  | /*! ZSTD_isError() : | 
|  | *  tells if a return value is an error code | 
|  | *  symbol is required for external callers */ | 
|  | unsigned ZSTD_isError(size_t code) { return ERR_isError(code); } | 
|  |  | 
|  | /*! ZSTD_getErrorName() : | 
|  | *  provides error code string from function result (useful for debugging) */ | 
|  | const char* ZSTD_getErrorName(size_t code) { return ERR_getErrorName(code); } | 
|  |  | 
|  | /*! ZSTD_getError() : | 
|  | *  convert a `size_t` function result into a proper ZSTD_errorCode enum */ | 
|  | ZSTD_ErrorCode ZSTD_getErrorCode(size_t code) { return ERR_getErrorCode(code); } | 
|  |  | 
|  | /*! ZSTD_getErrorString() : | 
|  | *  provides error code string from enum */ | 
|  | const char* ZSTD_getErrorString(ZSTD_ErrorCode code) { return ERR_getErrorString(code); } | 
|  |  | 
|  |  | 
|  |  | 
|  | /*=************************************************************** | 
|  | *  Custom allocator | 
|  | ****************************************************************/ | 
|  | void* ZSTD_customMalloc(size_t size, ZSTD_customMem customMem) | 
|  | { | 
|  | if (customMem.customAlloc) | 
|  | return customMem.customAlloc(customMem.opaque, size); | 
|  | return ZSTD_malloc(size); | 
|  | } | 
|  |  | 
|  | void* ZSTD_customCalloc(size_t size, ZSTD_customMem customMem) | 
|  | { | 
|  | if (customMem.customAlloc) { | 
|  | /* calloc implemented as malloc+memset; | 
|  | * not as efficient as calloc, but next best guess for custom malloc */ | 
|  | void* const ptr = customMem.customAlloc(customMem.opaque, size); | 
|  | ZSTD_memset(ptr, 0, size); | 
|  | return ptr; | 
|  | } | 
|  | return ZSTD_calloc(1, size); | 
|  | } | 
|  |  | 
|  | void ZSTD_customFree(void* ptr, ZSTD_customMem customMem) | 
|  | { | 
|  | if (ptr!=NULL) { | 
|  | if (customMem.customFree) | 
|  | customMem.customFree(customMem.opaque, ptr); | 
|  | else | 
|  | ZSTD_free(ptr); | 
|  | } | 
|  | } |