andre@0: /* This Source Code Form is subject to the terms of the Mozilla Public andre@0: * License, v. 2.0. If a copy of the MPL was not distributed with this andre@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ andre@0: andre@0: /* andre@0: * item.c andre@0: * andre@0: * This contains some item-manipulation code. andre@0: */ andre@0: andre@0: #ifndef BASE_H andre@0: #include "base.h" andre@0: #endif /* BASE_H */ andre@0: andre@0: /* andre@0: * nssItem_Create andre@0: * andre@0: * -- fgmr comments -- andre@0: * andre@0: * The error may be one of the following values: andre@0: * NSS_ERROR_INVALID_ARENA andre@0: * NSS_ERROR_NO_MEMORY andre@0: * NSS_ERROR_ARENA_MARKED_BY_ANOTHER_THREAD andre@0: * NSS_ERROR_INVALID_POINTER andre@0: * andre@0: * Return value: andre@0: * A pointer to an NSSItem upon success andre@0: * NULL upon failure andre@0: */ andre@0: andre@0: NSS_IMPLEMENT NSSItem * andre@0: nssItem_Create andre@0: ( andre@0: NSSArena *arenaOpt, andre@0: NSSItem *rvOpt, andre@0: PRUint32 length, andre@0: const void *data andre@0: ) andre@0: { andre@0: NSSItem *rv = (NSSItem *)NULL; andre@0: andre@0: #ifdef DEBUG andre@0: if( (NSSArena *)NULL != arenaOpt ) { andre@0: if( PR_SUCCESS != nssArena_verifyPointer(arenaOpt) ) { andre@0: return (NSSItem *)NULL; andre@0: } andre@0: } andre@0: andre@0: if( (const void *)NULL == data ) { andre@0: if( length > 0 ) { andre@0: nss_SetError(NSS_ERROR_INVALID_POINTER); andre@0: return (NSSItem *)NULL; andre@0: } andre@0: } andre@0: #endif /* DEBUG */ andre@0: andre@0: if( (NSSItem *)NULL == rvOpt ) { andre@0: rv = (NSSItem *)nss_ZNEW(arenaOpt, NSSItem); andre@0: if( (NSSItem *)NULL == rv ) { andre@0: goto loser; andre@0: } andre@0: } else { andre@0: rv = rvOpt; andre@0: } andre@0: andre@0: rv->size = length; andre@0: rv->data = nss_ZAlloc(arenaOpt, length); andre@0: if( (void *)NULL == rv->data ) { andre@0: goto loser; andre@0: } andre@0: andre@0: if( length > 0 ) { andre@0: (void)nsslibc_memcpy(rv->data, data, length); andre@0: } andre@0: andre@0: return rv; andre@0: andre@0: loser: andre@0: if( rv != rvOpt ) { andre@0: nss_ZFreeIf(rv); andre@0: } andre@0: andre@0: return (NSSItem *)NULL; andre@0: } andre@0: andre@0: NSS_IMPLEMENT void andre@0: nssItem_Destroy andre@0: ( andre@0: NSSItem *item andre@0: ) andre@0: { andre@0: nss_ClearErrorStack(); andre@0: andre@0: nss_ZFreeIf(item->data); andre@0: nss_ZFreeIf(item); andre@0: andre@0: } andre@0: andre@0: /* andre@0: * nssItem_Duplicate andre@0: * andre@0: * -- fgmr comments -- andre@0: * andre@0: * The error may be one of the following values: andre@0: * NSS_ERROR_INVALID_ARENA andre@0: * NSS_ERROR_NO_MEMORY andre@0: * NSS_ERROR_ARENA_MARKED_BY_ANOTHER_THREAD andre@0: * NSS_ERROR_INVALID_ITEM andre@0: * andre@0: * Return value: andre@0: * A pointer to an NSSItem upon success andre@0: * NULL upon failure andre@0: */ andre@0: andre@0: NSS_IMPLEMENT NSSItem * andre@0: nssItem_Duplicate andre@0: ( andre@0: NSSItem *obj, andre@0: NSSArena *arenaOpt, andre@0: NSSItem *rvOpt andre@0: ) andre@0: { andre@0: #ifdef DEBUG andre@0: if( (NSSArena *)NULL != arenaOpt ) { andre@0: if( PR_SUCCESS != nssArena_verifyPointer(arenaOpt) ) { andre@0: return (NSSItem *)NULL; andre@0: } andre@0: } andre@0: andre@0: if( (NSSItem *)NULL == obj ) { andre@0: nss_SetError(NSS_ERROR_INVALID_ITEM); andre@0: return (NSSItem *)NULL; andre@0: } andre@0: #endif /* DEBUG */ andre@0: andre@0: return nssItem_Create(arenaOpt, rvOpt, obj->size, obj->data); andre@0: } andre@0: andre@0: #ifdef DEBUG andre@0: /* andre@0: * nssItem_verifyPointer andre@0: * andre@0: * -- fgmr comments -- andre@0: * andre@0: * The error may be one of the following values: andre@0: * NSS_ERROR_INVALID_ITEM andre@0: * andre@0: * Return value: andre@0: * PR_SUCCESS upon success andre@0: * PR_FAILURE upon failure andre@0: */ andre@0: andre@0: NSS_IMPLEMENT PRStatus andre@0: nssItem_verifyPointer andre@0: ( andre@0: const NSSItem *item andre@0: ) andre@0: { andre@0: if( ((const NSSItem *)NULL == item) || andre@0: (((void *)NULL == item->data) && (item->size > 0)) ) { andre@0: nss_SetError(NSS_ERROR_INVALID_ITEM); andre@0: return PR_FAILURE; andre@0: } andre@0: andre@0: return PR_SUCCESS; andre@0: } andre@0: #endif /* DEBUG */ andre@0: andre@0: /* andre@0: * nssItem_Equal andre@0: * andre@0: * -- fgmr comments -- andre@0: * andre@0: * The error may be one of the following values: andre@0: * NSS_ERROR_INVALID_ITEM andre@0: * andre@0: * Return value: andre@0: * PR_TRUE if the items are identical andre@0: * PR_FALSE if they aren't andre@0: * PR_FALSE upon error andre@0: */ andre@0: andre@0: NSS_IMPLEMENT PRBool andre@0: nssItem_Equal andre@0: ( andre@0: const NSSItem *one, andre@0: const NSSItem *two, andre@0: PRStatus *statusOpt andre@0: ) andre@0: { andre@0: if( (PRStatus *)NULL != statusOpt ) { andre@0: *statusOpt = PR_SUCCESS; andre@0: } andre@0: andre@0: if( ((const NSSItem *)NULL == one) && ((const NSSItem *)NULL == two) ) { andre@0: return PR_TRUE; andre@0: } andre@0: andre@0: if( ((const NSSItem *)NULL == one) || ((const NSSItem *)NULL == two) ) { andre@0: return PR_FALSE; andre@0: } andre@0: andre@0: if( one->size != two->size ) { andre@0: return PR_FALSE; andre@0: } andre@0: andre@0: return nsslibc_memequal(one->data, two->data, one->size, statusOpt); andre@0: }