/* *%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% * SCR_DyAr.c * Dynamic array * * Scripts, Beaudet Christophe *%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */ /* *================================================================================================= * Includes. *================================================================================================= */ #include #include "SCR.h" /* *================================================================================================= * Functions. *================================================================================================= */ /* *------------------------------------------------------------------------------------------------- * To initialize a dynamic array. * _p_stArray : Array to initialize. *------------------------------------------------------------------------------------------------- */ void fn_v_DyAr_InitArray(SCR_tdst_DyAr_Description *_p_stArray) { /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ SCR_M_Dbg_Assert_P(_p_stArray != NULL); /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ _p_stArray->d_stDynArray = NULL; _p_stArray->uiNumValues = 0; _p_stArray->uiMaxValues = 0; } /* *------------------------------------------------------------------------------------------------- * To add a new element to a dynamic array. * _p_stArray : Array concerned. * _p_vElement : Element to add * _cInitMem : Initialise the eventual allocated memory ? * Returns index of allocated place, uiMaxValues in case of error. *------------------------------------------------------------------------------------------------- */ unsigned int fn_ui_DyAr_AllocateElement(SCR_tdst_DyAr_Description *_p_stArray, char _cInitMem) { /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ unsigned int uiIndex; unsigned int uiLastMax; /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ fn_v_Mem_SetMode(0); /* * We searched a free place in array. If uiIndex is equal to uiMaxValues, that means * that array is full and needs to be reallocate. */ uiIndex = _p_stArray->uiNumValues; /* Need an allocation ? */ if(uiIndex == _p_stArray->uiMaxValues) { uiLastMax = _p_stArray->uiMaxValues; _p_stArray->uiMaxValues += SCR_C_ui_DyAr_BaseForAllocation; /* Can be 0 */ /* * Is there's an already allocated array ? If it's the case, we realloc it. */ if(_p_stArray->d_stDynArray) { SCR_M_Mem_Realloc ( SCR_tdst_DyAr_Element, _p_stArray->d_stDynArray, _p_stArray->d_stDynArray, _p_stArray->uiMaxValues, SCR_C_ui_DyAr_BaseForAllocation ); if(_cInitMem) { memset ( &_p_stArray->d_stDynArray[uiLastMax], 0, (_p_stArray->uiMaxValues - uiLastMax) * sizeof(SCR_tdst_DyAr_Element) ); } } /* * Else we create a new one */ else { if(_cInitMem) { SCR_M_Mem_AllocAndSet ( SCR_tdst_DyAr_Element, _p_stArray->d_stDynArray, SCR_C_ui_DyAr_BaseForAllocation ); } else { SCR_M_Mem_Alloc ( SCR_tdst_DyAr_Element, _p_stArray->d_stDynArray, SCR_C_ui_DyAr_BaseForAllocation ); } } } /* * One more value in array. */ _p_stArray->uiNumValues++; /* Returns index */ return uiIndex; }