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