| OLD | NEW |
| (Empty) |
| 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 * item.c | |
| 7 * | |
| 8 * This contains some item-manipulation code. | |
| 9 */ | |
| 10 | |
| 11 #ifndef BASE_H | |
| 12 #include "base.h" | |
| 13 #endif /* BASE_H */ | |
| 14 | |
| 15 /* | |
| 16 * nssItem_Create | |
| 17 * | |
| 18 * -- fgmr comments -- | |
| 19 * | |
| 20 * The error may be one of the following values: | |
| 21 * NSS_ERROR_INVALID_ARENA | |
| 22 * NSS_ERROR_NO_MEMORY | |
| 23 * NSS_ERROR_ARENA_MARKED_BY_ANOTHER_THREAD | |
| 24 * NSS_ERROR_INVALID_POINTER | |
| 25 * | |
| 26 * Return value: | |
| 27 * A pointer to an NSSItem upon success | |
| 28 * NULL upon failure | |
| 29 */ | |
| 30 | |
| 31 NSS_IMPLEMENT NSSItem * | |
| 32 nssItem_Create(NSSArena *arenaOpt, NSSItem *rvOpt, PRUint32 length, | |
| 33 const void *data) | |
| 34 { | |
| 35 NSSItem *rv = (NSSItem *)NULL; | |
| 36 | |
| 37 #ifdef DEBUG | |
| 38 if ((NSSArena *)NULL != arenaOpt) { | |
| 39 if (PR_SUCCESS != nssArena_verifyPointer(arenaOpt)) { | |
| 40 return (NSSItem *)NULL; | |
| 41 } | |
| 42 } | |
| 43 | |
| 44 if ((const void *)NULL == data) { | |
| 45 if (length > 0) { | |
| 46 nss_SetError(NSS_ERROR_INVALID_POINTER); | |
| 47 return (NSSItem *)NULL; | |
| 48 } | |
| 49 } | |
| 50 #endif /* DEBUG */ | |
| 51 | |
| 52 if ((NSSItem *)NULL == rvOpt) { | |
| 53 rv = (NSSItem *)nss_ZNEW(arenaOpt, NSSItem); | |
| 54 if ((NSSItem *)NULL == rv) { | |
| 55 goto loser; | |
| 56 } | |
| 57 } else { | |
| 58 rv = rvOpt; | |
| 59 } | |
| 60 | |
| 61 rv->size = length; | |
| 62 rv->data = nss_ZAlloc(arenaOpt, length); | |
| 63 if ((void *)NULL == rv->data) { | |
| 64 goto loser; | |
| 65 } | |
| 66 | |
| 67 if (length > 0) { | |
| 68 (void)nsslibc_memcpy(rv->data, data, length); | |
| 69 } | |
| 70 | |
| 71 return rv; | |
| 72 | |
| 73 loser: | |
| 74 if (rv != rvOpt) { | |
| 75 nss_ZFreeIf(rv); | |
| 76 } | |
| 77 | |
| 78 return (NSSItem *)NULL; | |
| 79 } | |
| 80 | |
| 81 NSS_IMPLEMENT void | |
| 82 nssItem_Destroy(NSSItem *item) | |
| 83 { | |
| 84 nss_ClearErrorStack(); | |
| 85 | |
| 86 nss_ZFreeIf(item->data); | |
| 87 nss_ZFreeIf(item); | |
| 88 } | |
| 89 | |
| 90 /* | |
| 91 * nssItem_Duplicate | |
| 92 * | |
| 93 * -- fgmr comments -- | |
| 94 * | |
| 95 * The error may be one of the following values: | |
| 96 * NSS_ERROR_INVALID_ARENA | |
| 97 * NSS_ERROR_NO_MEMORY | |
| 98 * NSS_ERROR_ARENA_MARKED_BY_ANOTHER_THREAD | |
| 99 * NSS_ERROR_INVALID_ITEM | |
| 100 * | |
| 101 * Return value: | |
| 102 * A pointer to an NSSItem upon success | |
| 103 * NULL upon failure | |
| 104 */ | |
| 105 | |
| 106 NSS_IMPLEMENT NSSItem * | |
| 107 nssItem_Duplicate(NSSItem *obj, NSSArena *arenaOpt, NSSItem *rvOpt) | |
| 108 { | |
| 109 #ifdef DEBUG | |
| 110 if ((NSSArena *)NULL != arenaOpt) { | |
| 111 if (PR_SUCCESS != nssArena_verifyPointer(arenaOpt)) { | |
| 112 return (NSSItem *)NULL; | |
| 113 } | |
| 114 } | |
| 115 | |
| 116 if ((NSSItem *)NULL == obj) { | |
| 117 nss_SetError(NSS_ERROR_INVALID_ITEM); | |
| 118 return (NSSItem *)NULL; | |
| 119 } | |
| 120 #endif /* DEBUG */ | |
| 121 | |
| 122 return nssItem_Create(arenaOpt, rvOpt, obj->size, obj->data); | |
| 123 } | |
| 124 | |
| 125 #ifdef DEBUG | |
| 126 /* | |
| 127 * nssItem_verifyPointer | |
| 128 * | |
| 129 * -- fgmr comments -- | |
| 130 * | |
| 131 * The error may be one of the following values: | |
| 132 * NSS_ERROR_INVALID_ITEM | |
| 133 * | |
| 134 * Return value: | |
| 135 * PR_SUCCESS upon success | |
| 136 * PR_FAILURE upon failure | |
| 137 */ | |
| 138 | |
| 139 NSS_IMPLEMENT PRStatus | |
| 140 nssItem_verifyPointer(const NSSItem *item) | |
| 141 { | |
| 142 if (((const NSSItem *)NULL == item) || | |
| 143 (((void *)NULL == item->data) && (item->size > 0))) { | |
| 144 nss_SetError(NSS_ERROR_INVALID_ITEM); | |
| 145 return PR_FAILURE; | |
| 146 } | |
| 147 | |
| 148 return PR_SUCCESS; | |
| 149 } | |
| 150 #endif /* DEBUG */ | |
| 151 | |
| 152 /* | |
| 153 * nssItem_Equal | |
| 154 * | |
| 155 * -- fgmr comments -- | |
| 156 * | |
| 157 * The error may be one of the following values: | |
| 158 * NSS_ERROR_INVALID_ITEM | |
| 159 * | |
| 160 * Return value: | |
| 161 * PR_TRUE if the items are identical | |
| 162 * PR_FALSE if they aren't | |
| 163 * PR_FALSE upon error | |
| 164 */ | |
| 165 | |
| 166 NSS_IMPLEMENT PRBool | |
| 167 nssItem_Equal(const NSSItem *one, const NSSItem *two, PRStatus *statusOpt) | |
| 168 { | |
| 169 if ((PRStatus *)NULL != statusOpt) { | |
| 170 *statusOpt = PR_SUCCESS; | |
| 171 } | |
| 172 | |
| 173 if (((const NSSItem *)NULL == one) && ((const NSSItem *)NULL == two)) { | |
| 174 return PR_TRUE; | |
| 175 } | |
| 176 | |
| 177 if (((const NSSItem *)NULL == one) || ((const NSSItem *)NULL == two)) { | |
| 178 return PR_FALSE; | |
| 179 } | |
| 180 | |
| 181 if (one->size != two->size) { | |
| 182 return PR_FALSE; | |
| 183 } | |
| 184 | |
| 185 return nsslibc_memequal(one->data, two->data, one->size, statusOpt); | |
| 186 } | |
| OLD | NEW |