/*
 *
 *    Copyright (c) 2011-2015 Nest Labs, Inc.
 *    All rights reserved.
 *
 *    This document is the property of Nest. It is considered
 *    confidential and proprietary information.
 *
 *    This document may not be reproduced or transmitted in any form,
 *    in whole or in part, without the express written permission of
 *    Nest.
 *
 *    Description:
 *        Implementation of OpenSSL's memory allocation functions
 *        that maps onto the Pumise nlemalloc library.
 */

#include "stdlib.h"

extern void *nlemalloc(size_t aNeeded);
extern void *nlerealloc(void *aExisting, size_t aNeeded);
extern void *nlecalloc(size_t aCount, size_t aNeeded);
extern void nlefree(void *aToFree);
extern char *nlestrdup(const char *aToCopy);

void *CRYPTO_malloc(size_t needed)
{
    return nlemalloc(needed);
}

void *CRYPTO_realloc(void *existing, size_t needed)
{
    return nlerealloc(existing, needed);
}

void CRYPTO_free(void *tofree)
{
    nlefree(tofree);
}

char *CRYPTO_strdup(const char *s1)
{
    return nlestrdup(s1);
}

