1 /*
2  * Copyright (c) 2016-2020, 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 /* This file provides common libc dependencies that zstd requires.
12  * The purpose is to allow replacing this file with a custom implementation
13  * to compile zstd without libc support.
14  */
15 
16 /* Need:
17  * NULL
18  * INT_MAX
19  * UINT_MAX
20  * ZSTD_memcpy()
21  * ZSTD_memset()
22  * ZSTD_memmove()
23  */
24 #ifndef ZSTD_DEPS_COMMON
25 #define ZSTD_DEPS_COMMON
26 
27 #include <limits.h>
28 #include <stddef.h>
29 #include <string.h>
30 
31 #if defined(__GNUC__) && __GNUC__ >= 4
32 # define ZSTD_memcpy(d,s,l) __builtin_memcpy((d),(s),(l))
33 # define ZSTD_memmove(d,s,l) __builtin_memmove((d),(s),(l))
34 # define ZSTD_memset(p,v,l) __builtin_memset((p),(v),(l))
35 #else
36 # define ZSTD_memcpy(d,s,l) memcpy((d),(s),(l))
37 # define ZSTD_memmove(d,s,l) memmove((d),(s),(l))
38 # define ZSTD_memset(p,v,l) memset((p),(v),(l))
39 #endif
40 
41 #endif /* ZSTD_DEPS_COMMON */
42 
43 /* Need:
44  * ZSTD_malloc()
45  * ZSTD_free()
46  * ZSTD_calloc()
47  */
48 #ifdef ZSTD_DEPS_NEED_MALLOC
49 #ifndef ZSTD_DEPS_MALLOC
50 #define ZSTD_DEPS_MALLOC
51 
52 #include <stdlib.h>
53 
54 #define ZSTD_malloc(s) malloc(s)
55 #define ZSTD_calloc(n,s) calloc((n), (s))
56 #define ZSTD_free(p) free((p))
57 
58 #endif /* ZSTD_DEPS_MALLOC */
59 #endif /* ZSTD_DEPS_NEED_MALLOC */
60 
61 /*
62  * Provides 64-bit math support.
63  * Need:
64  * U64 ZSTD_div64(U64 dividend, U32 divisor)
65  */
66 #ifdef ZSTD_DEPS_NEED_MATH64
67 #ifndef ZSTD_DEPS_MATH64
68 #define ZSTD_DEPS_MATH64
69 
70 #define ZSTD_div64(dividend, divisor) ((dividend) / (divisor))
71 
72 #endif /* ZSTD_DEPS_MATH64 */
73 #endif /* ZSTD_DEPS_NEED_MATH64 */
74 
75 /* Need:
76  * assert()
77  */
78 #ifdef ZSTD_DEPS_NEED_ASSERT
79 #ifndef ZSTD_DEPS_ASSERT
80 #define ZSTD_DEPS_ASSERT
81 
82 #include <assert.h>
83 
84 #endif /* ZSTD_DEPS_ASSERT */
85 #endif /* ZSTD_DEPS_NEED_ASSERT */
86 
87 /* Need:
88  * ZSTD_DEBUG_PRINT()
89  */
90 #ifdef ZSTD_DEPS_NEED_IO
91 #ifndef ZSTD_DEPS_IO
92 #define ZSTD_DEPS_IO
93 
94 #include <stdio.h>
95 #define ZSTD_DEBUG_PRINT(...) fprintf(stderr, __VA_ARGS__)
96 
97 #endif /* ZSTD_DEPS_IO */
98 #endif /* ZSTD_DEPS_NEED_IO */
99 
100 /* Only requested when <stdint.h> is known to be present.
101  * Need:
102  * intptr_t
103  */
104 #ifdef ZSTD_DEPS_NEED_STDINT
105 #ifndef ZSTD_DEPS_STDINT
106 #define ZSTD_DEPS_STDINT
107 
108 #include <stdint.h>
109 
110 #endif /* ZSTD_DEPS_STDINT */
111 #endif /* ZSTD_DEPS_NEED_STDINT */
112