xref: /aosp_15_r20/external/pdfium/core/fxcrt/fx_memcpy_wrappers.h (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
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 // Wrappers to avoid the zero-length w/NULL arg gotchas in C spec. Use these
16 // if there is a possibility of a NULL arg (or a bad arg) that is to be ignored
17 // when the length is zero, otherwise just call the C Run Time Library function
18 // itself.
FXSYS_memcmp(const void * ptr1,const void * ptr2,size_t len)19 inline int FXSYS_memcmp(const void* ptr1, const void* ptr2, size_t len) {
20   return len ? memcmp(ptr1, ptr2, len) : 0;
21 }
22 
FXSYS_wmemcmp(const wchar_t * ptr1,const wchar_t * ptr2,size_t len)23 inline int FXSYS_wmemcmp(const wchar_t* ptr1, const wchar_t* ptr2, size_t len) {
24   return len ? wmemcmp(ptr1, ptr2, len) : 0;
25 }
26 
FXSYS_memcpy(void * ptr1,const void * ptr2,size_t len)27 inline void* FXSYS_memcpy(void* ptr1, const void* ptr2, size_t len) {
28   return len ? memcpy(ptr1, ptr2, len) : ptr1;
29 }
30 
FXSYS_wmemcpy(wchar_t * ptr1,const wchar_t * ptr2,size_t len)31 inline wchar_t* FXSYS_wmemcpy(wchar_t* ptr1, const wchar_t* ptr2, size_t len) {
32   return len ? wmemcpy(ptr1, ptr2, len) : ptr1;
33 }
34 
FXSYS_memmove(void * ptr1,const void * ptr2,size_t len)35 inline void* FXSYS_memmove(void* ptr1, const void* ptr2, size_t len) {
36   return len ? memmove(ptr1, ptr2, len) : ptr1;
37 }
38 
FXSYS_wmemmove(wchar_t * ptr1,const wchar_t * ptr2,size_t len)39 inline wchar_t* FXSYS_wmemmove(wchar_t* ptr1, const wchar_t* ptr2, size_t len) {
40   return len ? wmemmove(ptr1, ptr2, len) : ptr1;
41 }
42 
FXSYS_memset(void * ptr1,int val,size_t len)43 inline void* FXSYS_memset(void* ptr1, int val, size_t len) {
44   return len ? memset(ptr1, val, len) : ptr1;
45 }
46 
FXSYS_wmemset(wchar_t * ptr1,int val,size_t len)47 inline wchar_t* FXSYS_wmemset(wchar_t* ptr1, int val, size_t len) {
48   return len ? wmemset(ptr1, val, len) : ptr1;
49 }
50 
FXSYS_memchr(const void * ptr1,int val,size_t len)51 inline const void* FXSYS_memchr(const void* ptr1, int val, size_t len) {
52   return len ? memchr(ptr1, val, len) : nullptr;
53 }
54 
FXSYS_wmemchr(const wchar_t * ptr1,wchar_t val,size_t len)55 inline const wchar_t* FXSYS_wmemchr(const wchar_t* ptr1,
56                                     wchar_t val,
57                                     size_t len) {
58   return len ? wmemchr(ptr1, val, len) : nullptr;
59 }
60 
61 // Overloaded functions for C++ templates
FXSYS_len(const char * ptr)62 inline size_t FXSYS_len(const char* ptr) {
63   return strlen(ptr);
64 }
65 
FXSYS_len(const wchar_t * ptr)66 inline size_t FXSYS_len(const wchar_t* ptr) {
67   return wcslen(ptr);
68 }
69 
FXSYS_cmp(const char * ptr1,const char * ptr2,size_t len)70 inline int FXSYS_cmp(const char* ptr1, const char* ptr2, size_t len) {
71   return FXSYS_memcmp(ptr1, ptr2, len);
72 }
73 
FXSYS_cmp(const wchar_t * ptr1,const wchar_t * ptr2,size_t len)74 inline int FXSYS_cmp(const wchar_t* ptr1, const wchar_t* ptr2, size_t len) {
75   return FXSYS_wmemcmp(ptr1, ptr2, len);
76 }
77 
FXSYS_chr(const char * ptr,char ch,size_t len)78 inline const char* FXSYS_chr(const char* ptr, char ch, size_t len) {
79   return reinterpret_cast<const char*>(FXSYS_memchr(ptr, ch, len));
80 }
81 
FXSYS_chr(const wchar_t * ptr,wchar_t ch,size_t len)82 inline const wchar_t* FXSYS_chr(const wchar_t* ptr, wchar_t ch, size_t len) {
83   return FXSYS_wmemchr(ptr, ch, len);
84 }
85 
86 #endif  // CORE_FXCRT_FX_MEMCPY_WRAPPERS_H_
87