/*******************************************************************************
;*******************************************************************************
;**                                                                           **
;**                  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: et9aldb.h                                                    **
;**                                                                           **
;**  Description: Alphabetic LDB routines header file.                        **
;**                                                                           **
;*******************************************************************************
;******************************************************************************/

#ifndef ET9ALDB_H
#define ET9ALDB_H    1

#include "et9api.h"
#include "et9aslst.h"


/* don't mangle the function name if compile under C++ */
#if defined(__cplusplus)
extern "C" {
#endif


/*---------------------------------------------------------------------------
 *      CHUNK IDs
 *
 * IDs of various sections (chunks) of the LDB.
 * See duplicate declarations in
 * linguistics/code/et9Code/ldbbuild/et9api.h,
 * et9/alphabetic/tools/ldbupdate/et9api.h, and
 * et9/alphabetic/tools/et9ldbview/et9api.h.
 *---------------------------------------------------------------------------*/

#define ET9LDB_CHUNK_ID        1
#define ET9ASDB_CHUNK_ID       2
#define ET9CONTEXT_CHUNK_ID    3
#define ET9UNIGRAM_CHUNK_ID    4
#define ET9NGRAM_CHUNK_ID      5
#define ET9PLIST_CHUNK_ID      6
#define ET9APPEND_CHUNK_ID     7
#define ET9MGDCLASS_CHUNK_ID   8

/*---------------------------------------------------------------------------
 *      Locations of data in Alphabetic LDB.
 *---------------------------------------------------------------------------*/

#define ET9LDBOFFSET_LDBLAYOUTVER                       0x20
#define ET9LDBOFFSET_DATABASETYPE                       0x21
#define ET9LDBOFFSET_CHUNK_COUNT_BYTE                   0x23
#define ET9LDBOFFSET_COMPATID                           0x33

#define ET9LDBOFFSET_CONTENTSMAJORVER                   0x35
#define ET9LDBOFFSET_CONTENTSMINORVER                   0x36
#define ET9LDBOFFSET_CONTENTSDEVIATION                  0x37
#define ET9LDBOFFSET_CONTENTSHEADERDEV                  0x38

#define ET9LDBOFFSET_PRIMARYLANGID                      0x39
#define ET9LDBOFFSET_SECONDARYLANGID                    0x3A
#define ET9LDBOFFSET_SYMBOLCLASS                        0x3C

#define ET9LDBOFFSET_OEMID                              0x3D
#define ET9LDBOFFSET_CHECKSUM                           0x3F

#define ET9LDBOFFSET_BODY                               0x41

/* CLM defines */

#define ET9ALM_VERSION_OFFSET                           4
#define ET9ALM_LANGUAGE_OFFSET                          5
#define ET9ALM_START_ADDRESS_OFFSET                     6
#define ET9ALM_END_ADDRESS_OFFSET                       9
#define ET9ALM_NUM_ENTRIES_OFFSET                       12
#define ET9ALM_NUM_CLASSES_OFFSET                       15
#define ET9ALM_EMISSION_ENCODING_OFFSET                 17
#define ET9ALM_TRANSITION_ENCODING_OFFSET               19
#define ET9ALM_SCALE_FACTOR_OFFSET                      21
#define ET9ALM_ADD_CONSTANT_OFFSET                      22
#define ET9ALM_BACKOFF_SCALE_FACTOR_OFFSET              21
#define ET9ALM_BACKOFF_ADD_CONSTANT_OFFSET              26

/* NLM defines */

#define ET9AWLM_HEADER_SIZE                             55

#define ET9AWLM_MAJOR_VERSION_OFFSET                    4
#define ET9AWLM_MINOR_VERSION_OFFSET                    5
#define ET9AWLM_PRIMARY_LANGUAGE_OFFSET                 6
#define ET9AWLM_SECONDARY_LANGUAGE_OFFSET               7
#define ET9AWLM_START_ADDRESS_OFFSET                    8
#define ET9AWLM_END_ADDRESS_OFFSET                      11
#define ET9AWLM_P_BITS                                  14
#define ET9AWLM_W_BITS                                  15
#define ET9AWLM_ORDER                                   16
#define ET9AWLM_FORMAT_VERSION                          17
#define ET9AWLM_VALUE_TYPE                              19
#define ET9AWLM_QUANTIZATION                            20
#define ET9AWLM_CONST_STORAGE                           21
#define ET9AWLM_CONST_PRECISION                         22

#define ET9AWLM_INFO_SIZE                               32

#define ET9AWLM_INFO_START_ADDRESS_OFFSET               1
#define ET9AWLM_INFO_NUM_ENTRIES                        4
#define ET9AWLM_INFO_CURR_ORDER_START_ADDRESS_OFFSET    7
#define ET9AWLM_INFO_CURR_ORDER_NUM_ENTRIES             10
#define ET9AWLM_INFO_P_SCALE_FACTOR                     13
#define ET9AWLM_INFO_P_ADD_CONST                        18
#define ET9AWLM_INFO_W_SCALE_FACTOR                     23
#define ET9AWLM_INFO_W_ADD_CONST                        28

/* MGD defines */
#define ET9MGD_SUFFIX_DATA_OFFSET                    0x0A /* Start of the word-list data in an MGD suffix section. */
#define ET9MGD_VERSION_OFFSET                        0x04 /* Version for MGD Class chunk. */
#define ET9MGD_CLASS_FREQ_BITS                       0x0E /* Gives # of bits used on a frequency. */
#define ET9MGD_CLASS_HUFFMAN_OFFSET                  0x0F /* Gives one-/two-byte boundary for class #'s */
#define ET9MGD_NUM_CLASSES_OFFSET                    0x12

#define ET9MGD_STAND_ALONE                              0 /* Only stand-alone words. */
#define ET9MGD_FULL_WORD                                1 /* Complete (inflected) words and stand-alone words. */
#define ET9MGD_STEM                                     2 /* Stand-alone words or word stems. */

#define ET9WORD_INDEX_SIZE                              3
#define ET9CHILDREN_CT_SIZE                             2
#define ET9CHILD_PTR_SIZE                               3

#define ET9CHILDREN_CT_OFFSET_INDEX                     0
#define ET9CHILD_PTR_OFFSET_INDEX                       1
#define ET9BACKOFF_WT_OFFSET_INDEX                      2
#define ET9PROBABILITY_OFFSET_INDEX                     0

#define ET9UNKNOWN_INDEX                                16500000
#define ET9NUMERIC_INDEX                                16500001
#define ET9NULL_INDEX                                   16600000

#define ET9DEFAULT_SYMB                                 '.'
#define ET9DEFAULT_SYMB_LEN                             1
#define ET9DEFAULT_INDEX                                ET9UNKNOWN_INDEX

#define ET9AWLDB_MAX_COLLECTION_TAG_LEN                 8

#define ET9AW_MAX_AMBIG_SEGMENT_MATCHES                10 /* < -IDR-                                                */

typedef enum ET9ValueType_s
{
    ET9VALUE_NEGATIVE_LOG_PROBABILITY = 0,
    ET9VALUE_PROBABILITY

} ET9ValueType;

typedef enum ET9QuantizationType_s
{
    ET9QUANTIZATION_UNIFORM = 0,
    ET9QUANTIZATION_LOGARITHMIC,
    ET9QUANTIZATION_NON_UNIFORM

} ET9QuantizationType;

typedef enum ET9ConstantStorageType_s
{
    ET9CONSTANT_STORAGE_SIMPLE_FLOAT = 0,
    ET9CONSTANT_STORAGE_IEEE_FLOAT

} ET9ConstantStorageType;


ET9PRIVATE void ET9FARCALL _ET9AWLdbWordsByIndex(ET9AWLingInfo              * const pLingInfo,
                                                 const ET9U32                       dwLdbNum,
                                                 ET9U32                     * const pdwIndexes,
                                                 const ET9UINT                      nIndexCount,
                                                 const ET9U8                        bNLMOrder,
                                                 ET9AWPrivWordInfo          * const pWords);

ET9PRIVATE void ET9FARCALL _ET9AWLdbWordsSearch(ET9AWLingInfo              * const pLingInfo,
                                                const ET9U32                       dwLdbNum,
                                                const ET9U16                       wIndex,
                                                const ET9U16                       wLength,
                                                ET9U8                      * const pbLdbEntries,
                                                const ET9_FREQ_DESIGNATION         bFreqIndicator,
                                                const ET9U8                        bSpcMode,
                                                const ET9BOOL                      bAllowContextTagging);

ET9PRIVATE ET9STATUS ET9FARCALL _ET9AWLdbFind(ET9AWLingInfo        * const pLingInfo,
                                              const ET9U32                 dwLdbNum,
                                              const ET9U8                  bInflectOK,
                                              ET9AWPrivWordInfo    * const pWord,
                                              ET9U8                * const pbExact,
                                              ET9U8                * const pbLowercase,
                                              const ET9BOOL                bRetrieve);

ET9PRIVATE ET9STATUS ET9FARCALL _ET9AWLdbFindEntry(ET9AWLingInfo       * const pLingInfo,
                                                   const ET9U32                dwLdbNum,
                                                   const ET9U8                 bInflectOK,
                                                   ET9SYMB       const * const psWord,
                                                   const ET9U16                wWordLen,
                                                   ET9U32              * const pdwIndex,
                                                   ET9U8               * const pbExact,
                                                   ET9U8               * const pbLowercase);

ET9PRIVATE ET9STATUS ET9FARCALL _ET9AWLdbFindAmbigEntry(ET9AWLingInfo        * const pLingInfo,
                                                        const ET9U32                 dwLdbNum,
                                                        ET9SYMB        const * const psWord,
                                                        const ET9U16                 wWordLen,
                                                        const ET9U16                 wStartSymbIndex,
                                                        ET9SimpleWord        * const psWords,
                                                        ET9U8                * const pbExact,
                                                        ET9U32               * const pdwIndex,
                                                        ET9U8                * const pbNumberMatches,
                                                        ET9U8                * const pbExactIndex);

ET9PRIVATE void ET9FARCALL _ET9AWLMGetWordFreqByIndex(ET9AWLingInfo     * const pLingInfo,
                                                      const ET9U32              dwLdbNum,
                                                      const ET9U32              dwIndex,
                                                      ET9FREQPART       * const pxFreq,
                                                      ET9U8             * const pbNLMOrder);

ET9PRIVATE void ET9FARCALL _ET9AWLMGetWordFreq(ET9AWLingInfo     * const pLingInfo,
                                               const ET9U32              dwLdbNum,
                                               ET9AWPrivWordInfo * const pWord);

ET9PRIVATE ET9BOOL ET9FARCALL _ET9AWLdbIsSymbolUsed(ET9AWLingInfo * const pLingInfo,
                                                    const ET9U32          dwLdbNum,
                                                    const ET9SYMB         sSymb);

ET9PRIVATE ET9STATUS ET9FARCALL _ET9AWLdbTagContext(ET9AWLingInfo               * const pLingInfo,
                                                    const ET9U32                        dwLdbNum,
                                                    ET9AWPrivWordInfo     const * const pWord);

ET9PRIVATE void ET9FARCALL _ET9AWLdbNwpWordsSearch(ET9AWLingInfo  * const pLingInfo,
                                                   const ET9U32           dwLdbNum,
                                                   const ET9BOOL          bLdbTagOnly);

ET9BOOL ET9FARCALL _ET9AWLdbIsLMEntriesByIndex(ET9AWLingInfo           * const pLingInfo,
                                               const ET9U32                    dwLdbNum,
                                               const ET9U32                    dwFirstWordIndex,
                                               const ET9U32                    dwSecondWordIndex,
                                               ET9FREQPART             * const pxWordFreq,
                                               ET9U8                   * const pbNLMOrder);

ET9PRIVATE ET9BOOL ET9FARCALL _ET9AWLdbIsLMEntries(ET9AWLingInfo           * const pLingInfo,
                                                   ET9SimpleWord     const * const pFirstWord,
                                                   ET9SimpleWord     const * const pSecondWord,
                                                   ET9FREQPART             * const pxWordFreq,
                                                   ET9U8                   * const pbNLMOrder);

ET9PRIVATE ET9BOOL ET9FARCALL _ET9AW_IsUsingALM(ET9AWLingInfo * const pLingInfo);
ET9PRIVATE ET9BOOL ET9FARCALL _ET9AW_IsPrimaryMGD(ET9AWLingInfo * const pLingInfo);
ET9PRIVATE ET9BOOL ET9FARCALL _ET9AW_IsUsingMGD(ET9AWLingInfo * const pLingInfo);

/* private LDB use only */

ET9PRIVATE ET9U32 ET9FARCALL _ET9AW_FindChunk(ET9AWLingInfo * const pLingInfo, const ET9U8 bChunk);

ET9PRIVATE ET9STATUS ET9FARCALL _ET9AWLdb_SetActiveLanguage(ET9AWLingInfo * const pLingInfo,
                                                            const ET9U32          dwLdbNum);

ET9PRIVATE ET9U8 ET9FARCALL _ET9ReadLDBByte (ET9AWLingInfo * const pLingInfo,
                                             const ET9U32          dwOffset);

ET9PRIVATE ET9U16 ET9FARCALL _ET9ReadLDBWord2 (ET9AWLingInfo * const pLingInfo,
                                               const ET9U32          dwOffset);

ET9PRIVATE ET9U32 ET9FARCALL _ET9ReadLDBWord3 (ET9AWLingInfo * const pLingInfo,
                                               const ET9U32          dwOffset);

/* this feature is for future release */

#if 0
ET9PRIVATE ET9U8 ET9FARCALL _ET9AWLdbGetNextSymbolsPrediction(ET9AWLingInfo     *pLingInfo,
                                                              ET9AWWordSymbInfo *pWordSymbInfo);
#endif

#ifdef ET9_LIMITED_PRIVATE_ACCESS

ET9STATUS ET9FARCALL _PRIVATE_ET9AWLdbFindEntry(ET9AWLingInfo       * const pLingInfo,
                                                const ET9U32                dwLdbNum,
                                                const ET9U8                 bInflectOK,
                                                ET9SYMB       const * const psWord,
                                                const ET9U16                wWordLen,
                                                ET9U32              * const pdwIndex,
                                                ET9U8               * const pbExact,
                                                ET9U8               * const pbLowercase);

#endif /* ET9_LIMITED_PRIVATE_ACCESS */

/* End don't mangle the function name if compile under C++ */
#if defined (__cplusplus)
    }
#endif

#endif /* !ET9ALDB_H */
/* ----------------------------------< eof >--------------------------------- */
