1*c03c5b1cSMartin Matuska /*
2*c03c5b1cSMartin Matuska * Copyright (c) 2016-2020, Yann Collet, Facebook, Inc.
3*c03c5b1cSMartin Matuska * All rights reserved.
4*c03c5b1cSMartin Matuska *
5*c03c5b1cSMartin Matuska * This source code is licensed under both the BSD-style license (found in the
6*c03c5b1cSMartin Matuska * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7*c03c5b1cSMartin Matuska * in the COPYING file in the root directory of this source tree).
8*c03c5b1cSMartin Matuska * You may select, at your option, one of the above-listed licenses.
9*c03c5b1cSMartin Matuska */
10*c03c5b1cSMartin Matuska
11*c03c5b1cSMartin Matuska
12*c03c5b1cSMartin Matuska
13*c03c5b1cSMartin Matuska /*-*************************************
14*c03c5b1cSMartin Matuska * Dependencies
15*c03c5b1cSMartin Matuska ***************************************/
16*c03c5b1cSMartin Matuska #include <stdlib.h> /* malloc, calloc, free */
17*c03c5b1cSMartin Matuska #include <string.h> /* memset */
18*c03c5b1cSMartin Matuska #include "error_private.h"
19*c03c5b1cSMartin Matuska #include "zstd_internal.h"
20*c03c5b1cSMartin Matuska
21*c03c5b1cSMartin Matuska
22*c03c5b1cSMartin Matuska /*-****************************************
23*c03c5b1cSMartin Matuska * Version
24*c03c5b1cSMartin Matuska ******************************************/
ZSTD_versionNumber(void)25*c03c5b1cSMartin Matuska unsigned ZSTD_versionNumber(void) { return ZSTD_VERSION_NUMBER; }
26*c03c5b1cSMartin Matuska
ZSTD_versionString(void)27*c03c5b1cSMartin Matuska const char* ZSTD_versionString(void) { return ZSTD_VERSION_STRING; }
28*c03c5b1cSMartin Matuska
29*c03c5b1cSMartin Matuska
30*c03c5b1cSMartin Matuska /*-****************************************
31*c03c5b1cSMartin Matuska * ZSTD Error Management
32*c03c5b1cSMartin Matuska ******************************************/
33*c03c5b1cSMartin Matuska
34*c03c5b1cSMartin Matuska /*! ZSTD_isError() :
35*c03c5b1cSMartin Matuska * tells if a return value is an error code
36*c03c5b1cSMartin Matuska * symbol is required for external callers */
ZSTD_isError(size_t code)37*c03c5b1cSMartin Matuska unsigned ZSTD_isError(size_t code) { return ERR_isError(code); }
38*c03c5b1cSMartin Matuska
39*c03c5b1cSMartin Matuska /*! ZSTD_getErrorName() :
40*c03c5b1cSMartin Matuska * provides error code string from function result (useful for debugging) */
ZSTD_getErrorName(size_t code)41*c03c5b1cSMartin Matuska const char* ZSTD_getErrorName(size_t code) { return ERR_getErrorName(code); }
42*c03c5b1cSMartin Matuska
43*c03c5b1cSMartin Matuska /*! ZSTD_getError() :
44*c03c5b1cSMartin Matuska * convert a `size_t` function result into a proper ZSTD_errorCode enum */
ZSTD_getErrorCode(size_t code)45*c03c5b1cSMartin Matuska ZSTD_ErrorCode ZSTD_getErrorCode(size_t code) { return ERR_getErrorCode(code); }
46*c03c5b1cSMartin Matuska
47*c03c5b1cSMartin Matuska /*! ZSTD_getErrorString() :
48*c03c5b1cSMartin Matuska * provides error code string from enum */
ZSTD_getErrorString(ZSTD_ErrorCode code)49*c03c5b1cSMartin Matuska const char* ZSTD_getErrorString(ZSTD_ErrorCode code) { return ERR_getErrorString(code); }
50*c03c5b1cSMartin Matuska
51*c03c5b1cSMartin Matuska
52*c03c5b1cSMartin Matuska
53*c03c5b1cSMartin Matuska /*=**************************************************************
54*c03c5b1cSMartin Matuska * Custom allocator
55*c03c5b1cSMartin Matuska ****************************************************************/
ZSTD_malloc(size_t size,ZSTD_customMem customMem)56*c03c5b1cSMartin Matuska void* ZSTD_malloc(size_t size, ZSTD_customMem customMem)
57*c03c5b1cSMartin Matuska {
58*c03c5b1cSMartin Matuska if (customMem.customAlloc)
59*c03c5b1cSMartin Matuska return customMem.customAlloc(customMem.opaque, size);
60*c03c5b1cSMartin Matuska return malloc(size);
61*c03c5b1cSMartin Matuska }
62*c03c5b1cSMartin Matuska
ZSTD_calloc(size_t size,ZSTD_customMem customMem)63*c03c5b1cSMartin Matuska void* ZSTD_calloc(size_t size, ZSTD_customMem customMem)
64*c03c5b1cSMartin Matuska {
65*c03c5b1cSMartin Matuska if (customMem.customAlloc) {
66*c03c5b1cSMartin Matuska /* calloc implemented as malloc+memset;
67*c03c5b1cSMartin Matuska * not as efficient as calloc, but next best guess for custom malloc */
68*c03c5b1cSMartin Matuska void* const ptr = customMem.customAlloc(customMem.opaque, size);
69*c03c5b1cSMartin Matuska memset(ptr, 0, size);
70*c03c5b1cSMartin Matuska return ptr;
71*c03c5b1cSMartin Matuska }
72*c03c5b1cSMartin Matuska return calloc(1, size);
73*c03c5b1cSMartin Matuska }
74*c03c5b1cSMartin Matuska
ZSTD_free(void * ptr,ZSTD_customMem customMem)75*c03c5b1cSMartin Matuska void ZSTD_free(void* ptr, ZSTD_customMem customMem)
76*c03c5b1cSMartin Matuska {
77*c03c5b1cSMartin Matuska if (ptr!=NULL) {
78*c03c5b1cSMartin Matuska if (customMem.customFree)
79*c03c5b1cSMartin Matuska customMem.customFree(customMem.opaque, ptr);
80*c03c5b1cSMartin Matuska else
81*c03c5b1cSMartin Matuska free(ptr);
82*c03c5b1cSMartin Matuska }
83*c03c5b1cSMartin Matuska }
84