libc.c (3017B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 /* 6 * libc.c 7 * 8 * This file contains our wrappers/reimplementations for "standard" 9 * libc functions. Things like "memcpy." We add to this as we need 10 * it. Oh, and let's keep it in alphabetical order, should it ever 11 * get large. Most string/character stuff should be in utf8.c, not 12 * here. This file (and maybe utf8.c) should be the only ones in 13 * NSS to include files with angle brackets. 14 */ 15 16 #ifndef BASE_H 17 #include "base.h" 18 #endif /* BASE_H */ 19 20 #include <string.h> /* memcpy, memset */ 21 22 /* 23 * nsslibc_memcpy 24 * nsslibc_memset 25 * nsslibc_offsetof 26 * nsslibc_memequal 27 */ 28 29 /* 30 * nsslibc_memcpy 31 * 32 * Errors: 33 * NSS_ERROR_INVALID_POINTER 34 * 35 * Return value: 36 * NULL on error 37 * The destination pointer on success 38 */ 39 40 NSS_IMPLEMENT void * 41 nsslibc_memcpy(void *dest, const void *source, PRUint32 n) 42 { 43 #ifdef NSSDEBUG 44 if (((void *)NULL == dest) || ((const void *)NULL == source)) { 45 nss_SetError(NSS_ERROR_INVALID_POINTER); 46 return (void *)NULL; 47 } 48 #endif /* NSSDEBUG */ 49 50 return memcpy(dest, source, (size_t)n); 51 } 52 53 /* 54 * nsslibc_memset 55 * 56 * Errors: 57 * NSS_ERROR_INVALID_POINTER 58 * 59 * Return value: 60 * NULL on error 61 * The destination pointer on success 62 */ 63 64 NSS_IMPLEMENT void * 65 nsslibc_memset(void *dest, PRUint8 byte, PRUint32 n) 66 { 67 #ifdef NSSDEBUG 68 if (((void *)NULL == dest)) { 69 nss_SetError(NSS_ERROR_INVALID_POINTER); 70 return (void *)NULL; 71 } 72 #endif /* NSSDEBUG */ 73 74 return memset(dest, (int)byte, (size_t)n); 75 } 76 77 /* 78 * nsslibc_memequal 79 * 80 * Errors: 81 * NSS_ERROR_INVALID_POINTER 82 * 83 * Return value: 84 * PR_TRUE if they match 85 * PR_FALSE if they don't 86 * PR_FALSE upon error 87 */ 88 89 NSS_IMPLEMENT PRBool 90 nsslibc_memequal(const void *a, const void *b, PRUint32 len, 91 PRStatus *statusOpt) 92 { 93 #ifdef NSSDEBUG 94 if ((((void *)NULL == a) || ((void *)NULL == b))) { 95 nss_SetError(NSS_ERROR_INVALID_POINTER); 96 if ((PRStatus *)NULL != statusOpt) { 97 *statusOpt = PR_FAILURE; 98 } 99 return PR_FALSE; 100 } 101 #endif /* NSSDEBUG */ 102 103 if ((PRStatus *)NULL != statusOpt) { 104 *statusOpt = PR_SUCCESS; 105 } 106 107 if (0 == memcmp(a, b, len)) { 108 return PR_TRUE; 109 } else { 110 return PR_FALSE; 111 } 112 } 113 114 /* 115 * nsslibc_memcmp 116 */ 117 118 NSS_IMPLEMENT PRInt32 119 nsslibc_memcmp(const void *a, const void *b, PRUint32 len, PRStatus *statusOpt) 120 { 121 int v; 122 123 #ifdef NSSDEBUG 124 if ((((void *)NULL == a) || ((void *)NULL == b))) { 125 nss_SetError(NSS_ERROR_INVALID_POINTER); 126 if ((PRStatus *)NULL != statusOpt) { 127 *statusOpt = PR_FAILURE; 128 } 129 return -2; 130 } 131 #endif /* NSSDEBUG */ 132 133 if ((PRStatus *)NULL != statusOpt) { 134 *statusOpt = PR_SUCCESS; 135 } 136 137 v = memcmp(a, b, len); 138 return (PRInt32)v; 139 } 140 141 /* 142 * offsetof is a preprocessor definition 143 */