/*******************************************************************************
;*******************************************************************************
;**                                                                           **
;**                  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: et9aslst.h                                                  **
;**                                                                           **
;**  Description: Alphabetic selection list routines header file.             **
;**                                                                           **
;*******************************************************************************
;******************************************************************************/

#ifndef ET9ASLST_H
#define ET9ASLST_H    1

#include "et9api.h"

/* don't mangle the function name if compile under C++ */
#if defined(__cplusplus)
extern "C" {
#endif

#define ISDISPOSEWRD(pw)        (GETBASESRC((pw)->Body.bWordSrc) == ET9WORDSRC_STEMPOOL && ((pw)->Body.bWordQuality <= DISPOSABLE_QUALITY || (pw)->Body.bHasPrimEditDist))
#define ISPROTECTEDWRD(pw)      ((((pw)->Body.bIsGray || (pw)->Body.bIsBlack) && !ISEXACTSRC((pw)->Body.bWordSrc)) || (GETCOMPSRC((pw)->Body.bWordSrc) > ET9WORDSRC_STEMPOOL && GETCOMPSRC((pw)->Body.bWordSrc) < ET9WORDSRC_LAST))
#define ISDEMOTEWRD(pw)         ((pw)->Body.bIsWeak || GETRAWSRC((pw)->Body.bWordSrc) == ET9WORDSRC_MDB || GETRAWSRC((pw)->Body.bWordSrc) == ET9WORDSRC_LAS_SHORTCUT)
#define ISNONOVERRIDEWRD(pw)    ((pw)->Body.bIsBlack || (pw)->Body.bIsWeak || (pw)->Body.bIsQuarantine || GETCOMPSRC((pw)->Body.bWordSrc) == ET9WORDSRC_QUDB)

#define GETBASESRC(x)           (ET9WORDSRC)((x) & 0x3F)
#define GETATTRSRC(x)           (ET9WORDSRC)((x) & 0xC0)
#define GETCOMPSRC(x)           ((ET9WORDSRC)((ISEXACTSRC(x)) ? ET9WORDSRC_EXACT : (ISEXACTISHSRC(x)) ? ET9WORDSRC_EXACTISH : (x)))
#define GETRAWSRC(x)            (ET9WORDSRC)(ISBUILDAROUNDSRC(x) ? (GETBASESRC(x) - BUILDAROUND_SRC_ADDON) : ISCOMPOUNDSRC(x) ? (GETBASESRC(x) - BUILDCOMPOUND_SRC_ADDON) : GETBASESRC(x))
#define ISBASESRC(x)            (!GETATTRSRC(x))
#define ISEXACTSRC(x)           ((x) & EXACTOFFSET)
#define ISEXACTISHSRC(x)        ((x) & EXACTISHOFFSET)
#define ISREQUIREDSRC(x)        (GETBASESRC(x) == ET9WORDSRC_REQUIRED)
#define ISREALSRC(x)            (GETBASESRC(x) != ET9WORDSRC_NONE && GETBASESRC(x) != ET9WORDSRC_AUTOAPPEND && GETBASESRC(x) != ET9WORDSRC_BUILDAPPEND && GETBASESRC(x) != ET9WORDSRC_STEM && GETBASESRC(x) != ET9WORDSRC_MAGICSTRING && GETBASESRC(x) != ET9WORDSRC_EXACT_LAST)
#define ISPUNCTSRC(x)           (GETBASESRC(x) == ET9WORDSRC_TERMPUNCT || GETBASESRC(x) == ET9WORDSRC_COMPLETIONPUNCT)
#define ISCOMPOUNDSRC(x)        (GETBASESRC(x) > ET9WORDSRC_BUILDCOMPOUND_START && GETBASESRC(x) < ET9WORDSRC_MISC_START)
#define ISBUILDAROUNDSRC(x)     ((GETBASESRC(x) > ET9WORDSRC_BUILDAROUND_START && GETBASESRC(x) < ET9WORDSRC_BUILDCOMPOUND_START) || GETBASESRC(x) == ET9WORDSRC_BUILDAPPENDPUNCT)
#define ISCAPTURECANDSRC(x)     (!ISPUNCTSRC(x) && !ISBUILDAROUNDSRC(x) && GETBASESRC(x) != ET9WORDSRC_AUTOAPPEND && GETBASESRC(x) != ET9WORDSRC_BUILDAPPEND && GETBASESRC(x) != ET9WORDSRC_AUTOSPACE && GETBASESRC(x) != ET9WORDSRC_STEM && GETBASESRC(x) != ET9WORDSRC_MAGICSTRING && GETBASESRC(x) != ET9WORDSRC_EXACT_LAST)
#define ISALTCAPTURECANDSRC(x)  (!ISPUNCTSRC(x) && GETBASESRC(x) != ET9WORDSRC_AUTOAPPEND && GETBASESRC(x) != ET9WORDSRC_AUTOSPACE && GETBASESRC(x) != ET9WORDSRC_STEM && GETBASESRC(x) != ET9WORDSRC_MAGICSTRING)
#define ISGENUINESRC(x)         (ISREALSRC(x) && (GETBASESRC(x) < ET9WORDSRC_BUILDAROUND_START || (x) == ET9WORDSRC_TERM || (x) == ET9WORDSRC_GDB))
#define ISBUILDABLESRC(x)       (ISGENUINESRC(x) && GETBASESRC(x) != ET9WORDSRC_KDB)
#define ISSPOTSRC(x)            (GETCOMPSRC(x) == ET9WORDSRC_STEMPOOL)

#define BUILDAROUND_SRC_ADDON   (ET9WORDSRC_BUILDAROUND_CDB - ET9WORDSRC_CDB)
#define BUILDCOMPOUND_SRC_ADDON (ET9WORDSRC_BUILDCOMPOUND_CDB - ET9WORDSRC_CDB)
#define LDBPROMOTION_SRC_ADDON  (ET9WORDSRC_LDB_PROMOTION - ET9WORDSRC_LDB)

#define ADDON_FROM_FREQ_IND(freqInd,wordSrc)        \
    (freqInd == FREQ_BUILDAROUND) ?                 \
        (wordSrc + BUILDAROUND_SRC_ADDON) :         \
        ((freqInd == FREQ_BUILDCOMPOUND) ?          \
            (wordSrc + BUILDCOMPOUND_SRC_ADDON) :   \
            wordSrc)                                \

/* Given b = lower byte, a = upper byte; compose a word integral (ET9U16). */
#define ET9MAKEWORD(a, b)  ((ET9U16)(((ET9U8)(b)) | ((ET9U16)((ET9U8)(a))) << 8) )
#define ET9LOBYTE(w)       ((ET9U8)(w))
#define ET9HIBYTE(w)       ((ET9U8)(((ET9U16)(w) >> 8)))

/* the order of designation values have meaning */

typedef enum ET9_FREQ_DESIGNATION_e {
    FREQ_NORMAL,
    FREQ_TERM_PUNCT,
    FREQ_BUILDAROUND,
    FREQ_BUILDCOMPOUND

} ET9_FREQ_DESIGNATION;

/* Comparison function used for sorting and search word lists. */

typedef ET9INT fWordListComparator(ET9AWLingCmnInfo     * const pLingCmnInfo,
                                   const ET9INT                 snIndex1,
                                   const ET9INT                 snIndex2);

ET9PRIVATE void ET9FARCALL _ET9AWSortSearchListQS(ET9AWLingCmnInfo   * const pLingCmnInfo,
                                                  const ET9INT               snLo,
                                                  const ET9INT               snHi,
                                                  fWordListComparator        fCompareFn);

ET9PRIVATE ET9STATUS ET9FARCALL _ET9AWSelLstWordMatch(ET9AWLingInfo           * const pLingInfo,
                                                      ET9AWPrivWordInfo       * const pWord,
                                                      const ET9U16                    wIndex,
                                                      const ET9U16                    wLength,
                                                      ET9U8                   *       pbFound,
                                                      const ET9_FREQ_DESIGNATION      bFreqIndicator);

ET9PRIVATE ET9STATUS ET9FARCALL _ET9AWSelLstWordSearch(ET9AWLingInfo       * const pLingInfo,
                                                       ET9AWPrivWordInfo   * const pWord,
                                                       const ET9U16                wIndex,
                                                       const ET9U16                wLength,
                                                       const ET9_FREQ_DESIGNATION  bFreqIndicator);

ET9PRIVATE ET9STATUS ET9FARCALL _ET9AWSelLstAdd(ET9AWLingInfo          * const pLingInfo,
                                                ET9AWPrivWordInfo      * const pWord,
                                                const ET9U16                   wLength,
                                                const ET9_FREQ_DESIGNATION     bFreqIndicator);

ET9PRIVATE ET9STATUS ET9FARCALL _ET9AWSelLstStripActualTaps(ET9AWPrivWordInfo * const pSelWord);

ET9PRIVATE ET9STATUS ET9FARCALL _ET9AWSelLstWordPreAdd(ET9AWLingInfo       * const pLingInfo,
                                                       ET9AWPrivWordInfo   * const pWord,
                                                       const ET9U16                wFirstTap,
                                                       const ET9U8                 bInputLength,
                                                       const ET9U8                 bShiftPoint,
                                                       const ET9_FREQ_DESIGNATION  bFreqIndicator);

ET9PRIVATE ET9STATUS ET9FARCALL _ET9ASpellCheckSelLstBuild(ET9AWLingInfo   * const pLingInfo,
                                                           const ET9U32            dwLdbNum,
                                                           ET9U8           * const pbTotalWords,
                                                           ET9U8           * const pbDefaultListIndex);

ET9PRIVATE ET9U8 ET9FARCALL _ET9_GetSymbFreq(ET9AWLingCmnInfo    * const pLingCmnInfo,
                                             const ET9UINT               nPos,
                                             const ET9SYMB               sSymb,
                                             ET9BOOL             * const pbExactMatch,
                                             ET9BOOL             * const pbLimitedMatch);

ET9PRIVATE void ET9FARCALL _ET9_MakeWordTerm(ET9AWLingInfo         * const pLingInfo,
                                             _ET9AW_Collection     * const pCollection,
                                             const ET9UINT                 nWordIndex);

ET9PRIVATE void ET9FARCALL _ET9_LogSelList(ET9AWLingCmnInfo * const pLingCmnInfo);

#ifdef ET9_QA_ACCESS

ET9STATUS ET9FARCALL _ET9_QA_AWDoWordProcessing(ET9AWLingInfo     * const pLingInfo,
                                                ET9SYMB           * const pText,
                                                const ET9U16              wSize,
                                                const ET9U8               bLangIndex,
                                                const ET9UINT             nProcessType);

#endif /* ET9_QA_ACCESS */


/* End don't mangle the function name if compile under C++ */
#if defined (__cplusplus)
    }
#endif

#endif /* !ET9ASLST_H */
/* ----------------------------------< eof >--------------------------------- */
