1 // Copyright 2023 The PDFium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #ifndef CORE_FXCRT_FX_MEMCPY_WRAPPERS_H_
8 #define CORE_FXCRT_FX_MEMCPY_WRAPPERS_H_
9
10 #include <stddef.h>
11 #include <stdint.h>
12 #include <string.h>
13 #include <wchar.h>
14
15 #include "core/fxcrt/compiler_specific.h"
16
17 // Wrappers to avoid the zero-length w/NULL arg gotchas in C spec. Use these
18 // if there is a possibility of a NULL arg (or a bad arg) that is to be ignored
19 // when the length is zero, otherwise just call the C Run Time Library function
20 // itself.
FXSYS_memcmp(const void * ptr1,const void * ptr2,size_t len)21 UNSAFE_BUFFER_USAGE inline int FXSYS_memcmp(const void* ptr1,
22 const void* ptr2,
23 size_t len) {
24 return len ? memcmp(ptr1, ptr2, len) : 0;
25 }
26
FXSYS_wmemcmp(const wchar_t * ptr1,const wchar_t * ptr2,size_t len)27 UNSAFE_BUFFER_USAGE inline int FXSYS_wmemcmp(const wchar_t* ptr1,
28 const wchar_t* ptr2,
29 size_t len) {
30 return len ? wmemcmp(ptr1, ptr2, len) : 0;
31 }
32
FXSYS_memcpy(void * ptr1,const void * ptr2,size_t len)33 UNSAFE_BUFFER_USAGE inline void* FXSYS_memcpy(void* ptr1,
34 const void* ptr2,
35 size_t len) {
36 return len ? memcpy(ptr1, ptr2, len) : ptr1;
37 }
38
FXSYS_wmemcpy(wchar_t * ptr1,const wchar_t * ptr2,size_t len)39 UNSAFE_BUFFER_USAGE inline wchar_t* FXSYS_wmemcpy(wchar_t* ptr1,
40 const wchar_t* ptr2,
41 size_t len) {
42 return len ? wmemcpy(ptr1, ptr2, len) : ptr1;
43 }
44
FXSYS_memmove(void * ptr1,const void * ptr2,size_t len)45 UNSAFE_BUFFER_USAGE inline void* FXSYS_memmove(void* ptr1,
46 const void* ptr2,
47 size_t len) {
48 return len ? memmove(ptr1, ptr2, len) : ptr1;
49 }
50
FXSYS_wmemmove(wchar_t * ptr1,const wchar_t * ptr2,size_t len)51 UNSAFE_BUFFER_USAGE inline wchar_t* FXSYS_wmemmove(wchar_t* ptr1,
52 const wchar_t* ptr2,
53 size_t len) {
54 return len ? wmemmove(ptr1, ptr2, len) : ptr1;
55 }
56
FXSYS_memset(void * ptr1,int val,size_t len)57 UNSAFE_BUFFER_USAGE inline void* FXSYS_memset(void* ptr1, int val, size_t len) {
58 return len ? memset(ptr1, val, len) : ptr1;
59 }
60
FXSYS_wmemset(wchar_t * ptr1,int val,size_t len)61 UNSAFE_BUFFER_USAGE inline wchar_t* FXSYS_wmemset(wchar_t* ptr1,
62 int val,
63 size_t len) {
64 return len ? wmemset(ptr1, val, len) : ptr1;
65 }
66
FXSYS_memchr(const void * ptr1,int val,size_t len)67 UNSAFE_BUFFER_USAGE inline const void* FXSYS_memchr(const void* ptr1,
68 int val,
69 size_t len) {
70 return len ? memchr(ptr1, val, len) : nullptr;
71 }
72
FXSYS_wmemchr(const wchar_t * ptr1,wchar_t val,size_t len)73 UNSAFE_BUFFER_USAGE inline const wchar_t* FXSYS_wmemchr(const wchar_t* ptr1,
74 wchar_t val,
75 size_t len) {
76 return len ? wmemchr(ptr1, val, len) : nullptr;
77 }
78
79 #endif // CORE_FXCRT_FX_MEMCPY_WRAPPERS_H_
80