/*******************************************************************************
;*******************************************************************************
;**                                                                           **
;**                  COPYRIGHT 2001-2012 NUANCE COMMUNICATIONS                **
;**                                                                           **
;**               NUANCE COMMUNICATIONS PROPRIETARY INFORMATION               **
;**                                                                           **
;**     This software is supplied under the terms of a license agreement      **
;**     or non-disclosure agreement with Nuance Communications and may not    **
;**     be copied or disclosed except in accordance with the terms of that    **
;**     agreement.                                                            **
;**                                                                           **
;**                                                                           **
;*******************************************************************************
;**                                                                           **
;**     FileName: et9misc.h                                                   **
;**                                                                           **
;**  Description: Miscellaneous tools for ET9.                                **
;**                                                                           **
;*******************************************************************************
;******************************************************************************/

#ifndef ET9MISC_H
#define ET9MISC_H 1


#include "et9api.h"

/* don't mangle the function name if compile under C++ */
#if defined(__cplusplus)
extern "C" {
#endif


#ifdef ET9_DEBUG

#include <stdio.h>
#include <string.h>
#include <assert.h>

#ifndef ET9Assert
#define ET9Assert(e)        assert(e)
#endif

#else /* ET9_DEBUG */

#ifndef ET9Assert
#define ET9Assert(e)
#endif

#endif /* ET9_DEBUG */


#ifndef ET9_DEACTIVATE_MISCSTDCLIB_USE
#ifndef ET9ACTIVATEMISCSTDCLIBUSE
#define ET9ACTIVATEMISCSTDCLIBUSE
#endif
#endif

#ifdef ET9ACTIVATEMISCSTDCLIBUSE
#include <string.h>
#endif /* ET9ACTIVATEMISCSTDCLIBUSE */


/*------------------------------------------------------------------
 * Macros
 *------------------------------------------------------------------*/

#define __ET9Abs(x)         ((x) < 0 ? -(x) : (x))
#define __ET9Min(x, y)      (((x) <= (y)) ? (x) : (y))
#define __ET9Max(x, y)      (((x) >= (y)) ? (x) : (y))
#define __ET9Pin(x, y, z)   ((y) < (x) ? (x) : ((y) > (z) ? (z) : (y)))

#define __ET9BitSet(arr, ind)   ((arr)[(ind) >> 3] |=  (1 << ((ind) & 7)))                  /* < -IDR-                                 */
#define __ET9BitClear(arr, ind) ((arr)[(ind) >> 3] &= ~(1 << ((ind) & 7)))                  /* < -IDR-                                   */
#define __ET9BitCheck(arr, ind) ((arr)[(ind) >> 3] &   (1 << ((ind) & 7)))                  /* < -IDR-                                  */

#define _ET9InitSimpleWord(pWord)   _ET9ClearMem((ET9U8*)pWord, sizeof(ET9SimpleWord))

#define _ET9CHECKGENSTATUS()        {if (wStatus) { return wStatus; }}                      /**< depricated macro... */

#define ET9_UNUSED(x) (void)(!!(x))

/*------------------------------------------------------------------
 * Functions
 *------------------------------------------------------------------*/



ET9PRIVATE ET9STATUS ET9FARCALL _ET9CheckFundamentalTypes(void);
ET9PRIVATE ET9STATUS ET9FARCALL _ET9CheckCharProps(void);

ET9PRIVATE void ET9FARCALL _ET9BinaryToHex(ET9U8 byNumber, ET9SYMB *psDest);


#ifdef ET9ACTIVATEMISCSTDCLIBUSE

#define _ET9SymCopy(des, src, size)     memcpy((des),  (src), (size) * sizeof(ET9SYMB))
#define _ET9SymMove(des, src, size)     memmove((des), (src), (size) * sizeof(ET9SYMB))
#define _ET9ClearMem(des, size)         memset((des),  0,     (size))
#define _ET9ByteCopy(des, src, size)    memcpy((des),  (src), (size))
#define _ET9ByteMove(des, src, size)    memmove((des), (src), (size))
#define _ET9ByteSet(des, size, s)       memset((des),  (s),   (size))

#else /* ET9ACTIVATEMISCSTDCLIBUSE */

ET9PRIVATE void ET9FARCALL _ET9SymCopy(ET9SYMB *des, ET9SYMB const *src, ET9U32 size);
ET9PRIVATE void ET9FARCALL _ET9SymMove(ET9SYMB *dst, ET9SYMB const *src, ET9U32 size);
ET9PRIVATE void ET9FARCALL _ET9ClearMem(ET9U8 *des, ET9U32 size);
ET9PRIVATE void ET9FARCALL _ET9ByteCopy(ET9U8 *des, ET9U8 const *src, ET9U32 size);
ET9PRIVATE void ET9FARCALL _ET9ByteMove(ET9U8 *des, ET9U8 const *src, ET9U32 size);
ET9PRIVATE void ET9FARCALL _ET9ByteSet(ET9U8 *des, ET9U32 size, ET9U8 s);

#endif /* ET9ACTIVATEMISCSTDCLIBUSE */


ET9PRIVATE void ET9FARCALL _ET9WordSet(ET9U16 *des, ET9U32 size, ET9U16 s);    /* obsolete */


ET9PRIVATE ET9FLOAT ET9FARCALL _ET9acos_f(const ET9FLOAT fX);
ET9PRIVATE ET9FLOAT ET9FARCALL _ET9atan2_f(const ET9FLOAT fY, const ET9FLOAT fX);
ET9PRIVATE ET9FLOAT ET9FARCALL _ET9sqrt_f(const ET9FLOAT fX);
ET9PRIVATE ET9FLOAT ET9FARCALL _ET9fabsf(const ET9FLOAT fX);
ET9PRIVATE ET9DOUBLE ET9FARCALL _ET9sqrt(const ET9DOUBLE dX);

ET9PRIVATE ET9FLOAT ET9FARCALL _ET9log_f(const ET9FLOAT fX);
ET9PRIVATE ET9FLOAT ET9FARCALL _ET9pow_f(const ET9FLOAT fX, const ET9FLOAT fY);


ET9PRIVATE ET9U8 ET9FARCALL _ET9SymbToUtf8(const ET9SYMB           sIn,
                                           ET9U8           * const pbOut);

ET9PRIVATE ET9U8 ET9FARCALL _ET9Utf8ToSymb(ET9U8      const * const pbIn,
                                           ET9U8      const * const pbEnd,
                                           ET9SYMB          * const psOut);

ET9PRIVATE ET9U8 ET9FARCALL _ET9DecodeSpecialChar(ET9U8      const * const pbIn,
                                                  ET9U8      const * const pbEnd,
                                                  ET9SYMB          * const psOut);

ET9PRIVATE ET9INT ET9FARCALL _ET9symbncmp(ET9SYMB  const * const psString1, ET9SYMB  const * const psString2, const ET9U16 wLen);
ET9PRIVATE ET9INT ET9FARCALL _ET9symbnicmp(ET9SYMB const * const psString1, ET9SYMB  const * const psString2, const ET9U16 wLen, ET9U32 dwLdbNum);

ET9PRIVATE ET9U32 ET9FARCALL _ET9ByteCheckSum(ET9U8 const * const pbData, const ET9U32 dwLength);

ET9PRIVATE ET9U32 ET9FARCALL _ET9ByteStringCheckSum(ET9U8 const * const pbString);

ET9PRIVATE ET9U32 ET9FARCALL _ET9SymbStringCheckSum(ET9SYMB const * const psString, const ET9UINT nLength);


ET9PRIVATE ET9U32 ET9FARCALL _ET9ReadByte (ET9U8 const * const pbData, const ET9U32 dwOffset, ET9U8  * const pbValue);
ET9PRIVATE ET9U32 ET9FARCALL _ET9ReadWord2(ET9U8 const * const pbData, const ET9U32 dwOffset, ET9U16 * const pwValue);
ET9PRIVATE ET9U32 ET9FARCALL _ET9ReadWord3(ET9U8 const * const pbData, const ET9U32 dwOffset, ET9U32 * const pdwValue);
ET9PRIVATE ET9U32 ET9FARCALL _ET9ReadWord4(ET9U8 const * const pbData, const ET9U32 dwOffset, ET9U32 * const pdwValue);

ET9PRIVATE ET9U32 ET9FARCALL _ET9WriteByte (ET9U8 * const pbData, const ET9U32 dwOffset, const ET9U8  bValue);
ET9PRIVATE ET9U32 ET9FARCALL _ET9WriteWord2(ET9U8 * const pbData, const ET9U32 dwOffset, const ET9U16 wValue);
ET9PRIVATE ET9U32 ET9FARCALL _ET9WriteWord3(ET9U8 * const pbData, const ET9U32 dwOffset, const ET9U32 dwValue);
ET9PRIVATE ET9U32 ET9FARCALL _ET9WriteWord4(ET9U8 * const pbData, const ET9U32 dwOffset, const ET9U32 dwValue);


#ifdef _ET9_SPEED_PROFILING

#ifndef ET9S64
#define ET9S64     signed long long
#endif

#ifndef ET9U64
#define ET9U64     unsigned long long
#endif

extern ET9U64 tAW_SelLst_Build;
extern ET9U64 tAW_SelLst_BuildSearch;
extern ET9U64 tAW_SelLst_BuildFullBuilds;
extern ET9U64 tAW_SelLst_MgdStemBuild;
extern ET9U64 tAW_SelLst_MgdSuffixBuild;
extern ET9U64 tAW_SelLst_MgdStemMatching;
extern ET9U64 tAW_SelLst_MgdSuffixMatching;
extern ET9U64 tAW_SelLst_PostProcessing;
extern ET9U64 tAW_SelLst_SpmScoring;
extern ET9U64 tAW_SelLst_GestureProcessing;
extern ET9U64 tAW_SelLst_SpaceSegmentation;
extern ET9U64 tAW_SelLst_UpdateBuiltInWordFreqs;
extern ET9U64 tAW_SelLst_SortPriorityList;
extern ET9U64 tAW_SelLst_PriorityListFinalOrder;
extern ET9U64 tAW_SelLst_DoBuildPostProcessing;
extern ET9U64 tAW_SelLst_DoBuildFinalProcessing;
extern ET9U64 tAW_SelLst_ShrinkSelListToTargetSize;

extern ET9U64 tAW_DLM_AddWord;
extern ET9U64 tAW_DLM_FindWord;
extern ET9U64 tAW_DLM_WordSearch;
extern ET9U64 tAW_DLM_Confidence;
extern ET9U64 tAW_DLM_ProcessEntries;

ET9PRIVATE void ET9FARCALL _ET9_InitProfiling(void);
ET9PRIVATE void ET9FARCALL _ET9_DoneProfiling(void);

ET9PRIVATE ET9U64 ET9FARCALL _ET9_GetTime(void);
ET9PRIVATE void ET9FARCALL _ET9_UpdateTracker(ET9U64 * const ptTracker, ET9U64 * const ptStartTime);

#define __ProfileStart \
    ET9U64 tStartTime = _ET9_GetTime()

#define __ProfileEnd(tTimeTracker) \
    _ET9_UpdateTracker(&tTimeTracker, &tStartTime)

#else

#define __ProfileStart
#define __ProfileEnd(q)

#define _ET9_InitProfiling()
#define _ET9_DoneProfiling()

#endif /* _ET9_SPEED_PROFILING */


/* End don't mangle the function name if compile under C++ */
#if defined(__cplusplus)
    }
#endif

#endif /* ET9MISC_H */


/* ----------------------------------< eof >--------------------------------- */

