/*
* RELIC is an Efficient LIbrary for Cryptography
* Copyright (c) 2018 RELIC Authors
*
* This file is part of RELIC. RELIC is legal property of its developers,
* whose names are not listed here. Please refer to the COPYRIGHT file
* for contact information.
*
* RELIC is free software; you can redistribute it and/or modify it under the
* terms of the version 2.1 (or later) of the GNU Lesser General Public License
* as published by the Free Software Foundation; or version 2.0 of the Apache
* License as published by the Apache Software Foundation. See the LICENSE files
* for more details.
*
* RELIC is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
* A PARTICULAR PURPOSE. See the LICENSE files for more details.
*
* You should have received a copy of the GNU Lesser General Public or the
* Apache License along with RELIC. If not, see
* or .
*/
/**
* @file
*
* Implementation of the auxiliary memory allocation functions.
*
* @ingroup utils
*/
#include "relic_conf.h"
#if defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__)
#include
/*
* Dynamiclly allocates an array of "Type" with the specified size on the stack.
* This memory will be automaticlly deallocated from the stack when the function
* frame is returned from.
* Note: This is the Windows specific implementation.
*
* @param[in] T - the type of each object.
* @param[in] S - the number of obecs to allocate.
*/
#if ALLOC == DYNAMIC
#define RLC_ALLOCA(T, S) (T*) calloc((S), sizeof(T))
#else
#define RLC_ALLOCA(T, S) (T*) _alloca((S) * sizeof(T))
#endif
#else /* _MSC_VER */
#if OPSYS == FREEBSD || OPSYS == NETBSD
#include
#else
#include
#endif
/*
* Dynamiclly allocates an array of "Type" with the specified size on the stack.
* This memory will be automaticlly deallocated from the stack when the function
* frame is returned from.
* Note: This is the POSIX specific implementation.
*
* @param[in] T - the type of each object.
* @param[in] S - the number of obecs to allocate.
*/
#if ALLOC == DYNAMIC
#define RLC_ALLOCA(T, S) (T*) malloc((S) * sizeof(T))
#else
#define RLC_ALLOCA(T, S) (T*) alloca((S) * sizeof(T))
#endif
#endif
/*
* Free memory allocated with RLC_ALLOCA.
*
* @param[in] A - the variable to free.
*/
#if ALLOC == DYNAMIC
#define RLC_FREE(A) \
if (A != NULL) { \
free((void *)A); \
A = NULL; \
}
#else
#define RLC_FREE(A) (void)A;
#endif