/* ** 2011-08-18 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: ** ** May you do good and not evil. ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* ** ** Helper routines for memory allocation. */ #include "lsmInt.h" /* ** The following routines are called internally by LSM sub-routines. In ** this case a valid environment pointer must be supplied. */ void *lsmMalloc(lsm_env *pEnv, size_t N){ assert( pEnv ); return pEnv->xMalloc(pEnv, N); } void lsmFree(lsm_env *pEnv, void *p){ assert( pEnv ); pEnv->xFree(pEnv, p); } void *lsmRealloc(lsm_env *pEnv, void *p, size_t N){ assert( pEnv ); return pEnv->xRealloc(pEnv, p, N); } /* ** Core memory allocation routines for LSM. */ void *lsm_malloc(lsm_env *pEnv, size_t N){ return lsmMalloc(pEnv ? pEnv : lsm_default_env(), N); } void lsm_free(lsm_env *pEnv, void *p){ lsmFree(pEnv ? pEnv : lsm_default_env(), p); } void *lsm_realloc(lsm_env *pEnv, void *p, size_t N){ return lsmRealloc(pEnv ? pEnv : lsm_default_env(), p, N); } void *lsmMallocZero(lsm_env *pEnv, size_t N){ void *pRet; assert( pEnv ); pRet = lsmMalloc(pEnv, N); if( pRet ) memset(pRet, 0, N); return pRet; } void *lsmMallocRc(lsm_env *pEnv, size_t N, int *pRc){ void *pRet = 0; if( *pRc==LSM_OK ){ pRet = lsmMalloc(pEnv, N); if( pRet==0 ){ *pRc = LSM_NOMEM_BKPT; } } return pRet; } void *lsmMallocZeroRc(lsm_env *pEnv, size_t N, int *pRc){ void *pRet = 0; if( *pRc==LSM_OK ){ pRet = lsmMallocZero(pEnv, N); if( pRet==0 ){ *pRc = LSM_NOMEM_BKPT; } } return pRet; } void *lsmReallocOrFree(lsm_env *pEnv, void *p, size_t N){ void *pNew; pNew = lsm_realloc(pEnv, p, N); if( !pNew ) lsm_free(pEnv, p); return pNew; } void *lsmReallocOrFreeRc(lsm_env *pEnv, void *p, size_t N, int *pRc){ void *pRet = 0; if( *pRc ){ lsmFree(pEnv, p); }else{ pRet = lsmReallocOrFree(pEnv, p, N); if( !pRet ) *pRc = LSM_NOMEM_BKPT; } return pRet; } char *lsmMallocStrdup(lsm_env *pEnv, const char *zIn){ int nByte; char *zRet; nByte = strlen(zIn); zRet = lsmMalloc(pEnv, nByte+1); if( zRet ){ memcpy(zRet, zIn, nByte+1); } return zRet; }