175 lines
4.9 KiB
C
175 lines
4.9 KiB
C
/*
|
|
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
* SCR_Hash.h
|
|
* Scripts, Beaudet Christophe
|
|
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
*/
|
|
|
|
#ifndef __SCR_Hash_h__Types
|
|
#define __SCR_Hash_h__Types
|
|
|
|
#ifndef __Only_Types__
|
|
#define __SCR_Hash_h__Undef
|
|
#define __Only_Types__
|
|
#endif /* !__Only_Types__ */
|
|
|
|
/*
|
|
*=================================================================================================
|
|
* Includes.
|
|
*=================================================================================================
|
|
*/
|
|
#include "SCR_DyAr.h"
|
|
|
|
#ifdef __SCR_Hash_h__Undef
|
|
#undef __Only_Types__
|
|
#undef __SCR_Hash_h__Undef
|
|
#endif /* __HSH_Hash_h__Undef */
|
|
|
|
/*
|
|
*=================================================================================================
|
|
* Constants.
|
|
*=================================================================================================
|
|
*/
|
|
|
|
/*
|
|
* To export code.
|
|
*/
|
|
#undef CPA_EXPORT
|
|
#if defined(CPA_WANTS_IMPORT)
|
|
#define CPA_EXPORT __declspec(dllimport)
|
|
#elif defined(CPA_WANTS_EXPORT)
|
|
#define CPA_EXPORT __declspec(dllexport)
|
|
#else /* CPA_WANTS_IMPORT */
|
|
#define CPA_EXPORT
|
|
#endif /* CPA_WANTS_IMPORT */
|
|
|
|
/*
|
|
* To define hash size.
|
|
*/
|
|
#define SCR_C_ui_Hash_Modulo 256
|
|
#define SCR_C_ui_Hash_Size SCR_C_ui_Hash_Modulo
|
|
|
|
/*
|
|
*=================================================================================================
|
|
* Types.
|
|
*=================================================================================================
|
|
*/
|
|
|
|
/*
|
|
* Structure that describes a value associated to an hash key code
|
|
*/
|
|
typedef struct SCR_tdst_Hash_Value_
|
|
{
|
|
SCR_tdst_DyAr_Header stHeader; /* Header of element */
|
|
unsigned long ulValue; /* Hash value */
|
|
} SCR_tdst_Hash_Value;
|
|
|
|
/*
|
|
* Type that describes an hash table.
|
|
* It's an array of entries.
|
|
*/
|
|
typedef SCR_tdst_DyAr_Description SCR_tda_st_Hash_Table[SCR_C_ui_Hash_Size];
|
|
|
|
/*
|
|
* Type that describes an hash key.
|
|
* It's a indice in a hash table.
|
|
*/
|
|
typedef unsigned int SCR_tdx_Hash_Key;
|
|
|
|
#endif /* !__HSH_Hash_h__Types */
|
|
|
|
/*
|
|
*=================================================================================================
|
|
* Macros.
|
|
*=================================================================================================
|
|
*/
|
|
|
|
#if !defined(__SCR_Hash_h__Macros) && !defined(__Only_Types__)
|
|
#define __SCR_Hash_h__Macros
|
|
|
|
/*
|
|
* Simply pack an hash table by just adjusting its size.
|
|
* _Array : Array to realloc.
|
|
*/
|
|
#define SCR_M_Hash_SimplePackArray(_Array)\
|
|
{\
|
|
unsigned int _Hash_uiPos_;\
|
|
for(_Hash_uiPos_ = 0; _Hash_uiPos_ < SCR_C_ui_Hash_Size; _Hash_uiPos_++)\
|
|
{\
|
|
SCR_M_DyAr_SimplePackArray(SCR_tdst_Hash_Value, _Array[_Hash_uiPos_]);\
|
|
}\
|
|
}
|
|
|
|
/*
|
|
* A macro to reduce the size of an hash table.
|
|
* _Array : Hash table to reduce.
|
|
* _Cast : Cast of an element of linked array.
|
|
* _Array2 : Linked array.
|
|
*/
|
|
#define SCR_M_Hash_PackArray(_Array, _Cast, _Array2, _Field1, _Field2)\
|
|
{\
|
|
unsigned int _Hash_uiPos_, _Hash_uiPos1_;\
|
|
_Cast *p_stPointer;\
|
|
for(_Hash_uiPos_ = 0; _Hash_uiPos_ < SCR_C_ui_Hash_Size; _Hash_uiPos_++)\
|
|
{\
|
|
SCR_M_DyAr_PackArray\
|
|
(\
|
|
SCR_tdst_Hash_Value,\
|
|
_Array[_Hash_uiPos_],\
|
|
for(_Hash_uiPos1_ = 0; _Hash_uiPos1_ < (_Array2).uiNumValues; _Hash_uiPos1_++)\
|
|
{\
|
|
SCR_M_DyAr_GetElement(_Cast, _Hash_uiPos1_, p_stPointer, _Array2);\
|
|
if(p_stPointer)\
|
|
{\
|
|
if\
|
|
(\
|
|
(p_stPointer->##_Field1 == _Hash_uiPos_)\
|
|
&& (p_stPointer->##_Field2 == (unsigned int) _DyAr_iEndPos_)\
|
|
)\
|
|
p_stPointer->##_Field2 = _DyAr_iBegPos_;\
|
|
}\
|
|
}\
|
|
);\
|
|
}\
|
|
}
|
|
|
|
/*
|
|
* A macro delete hash values depending on memory level.
|
|
*/
|
|
#define SCR_M_Hash_DeleteWithMemLevel(_Array, _ucMin, _ucMax)\
|
|
{\
|
|
unsigned int _Hash_uiPos_;\
|
|
for(_Hash_uiPos_ = 0; _Hash_uiPos_ < SCR_C_ui_Hash_Size; _Hash_uiPos_++)\
|
|
{\
|
|
SCR_M_DyAr_DeleteElementWithMemLevel\
|
|
(\
|
|
SCR_tdst_Hash_Value,\
|
|
_Array[_Hash_uiPos_],\
|
|
;,\
|
|
_ucMin,\
|
|
_ucMax\
|
|
);\
|
|
}\
|
|
}
|
|
|
|
#endif /* !__SCR_Hash_h__Macros && !__OnlyTypes */
|
|
|
|
/*
|
|
*=================================================================================================
|
|
* Protos.
|
|
*=================================================================================================
|
|
*/
|
|
|
|
#if !defined(__SCR_Hash_h__Protos) && !defined(__Only_Types__)
|
|
#define __SCR_Hash_h__Protos
|
|
|
|
extern void fn_v_Hash_InitTable(SCR_tda_st_Hash_Table);
|
|
extern void fn_v_Hash_CloseTable(SCR_tda_st_Hash_Table);
|
|
|
|
CPA_EXPORT extern SCR_tdx_Hash_Key SCR_fn_x_Hash_ComputeHashKeyForString(char *);
|
|
CPA_EXPORT extern SCR_tdx_Hash_Key SCR_fn_x_Hash_ComputeHashKeyForLong(long);
|
|
|
|
extern SCR_tdst_Hash_Value *fnp_st_Hash_AddValue(SCR_tdx_Hash_Key, SCR_tda_st_Hash_Table, unsigned long, unsigned int *);
|
|
|
|
#endif /* !__HSH_Hash_h__Protos && !__Only_Types__ */
|