windows-nt/Source/XPSP1/NT/enduser/speech/tts/msttsdrv/engine/stdsentenum.h
2020-09-26 16:20:57 +08:00

1009 lines
31 KiB
C++

/******************************************************************************
* StdSentEnum.h *
*---------------*
* This is the header file for the CStdSentEnum implementation.
*------------------------------------------------------------------------------
* Copyright (C) 1999 Microsoft Corporation Date: 03/01/99
* All Rights Reserved
*
*********************************************************************** EDC ***/
#ifndef StdSentEnum_h
#define StdSentEnum_h
//--- Additional includes
#include "stdafx.h"
#include "spttseng.h"
#include "resource.h"
#include "SentItemMemory.h"
#include "morph.h"
//=== Constants ====================================================
typedef enum SEPARATOR_AND_DECIMAL
{
PERIOD_COMMA = (1L << 0),
COMMA_PERIOD = (1L << 1)
} SEPARATOR_AND_DECIMAL;
typedef enum SHORT_DATE_ORDER
{
MONTH_DAY_YEAR = (1L << 0),
DAY_MONTH_YEAR = (1L << 1),
YEAR_MONTH_DAY = (1L << 2)
} SHORT_DATE_ORDER;
//--- Vowel WCHAR values - used to disambiguate pronunciations of certain words
const WCHAR g_Vowels[] =
{
0x0a, // AA
0x0b, // AE
0x0c, // AH
0x0d, // AO
0x0e, // AW
0x0f, // AX
0x10, // AY
0x15, // EH
0x16, // ER
0x17, // EY
0x1b, // IH
0x1c, // IY
0x23, // OW
0x24, // OY
0x2a, // UH
0x2b, // UW
};
//--- Normalization constants - see NormData.cpp
extern const char g_pFlagCharacter;
extern const unsigned char g_AnsiToAscii[256];
extern const SPLSTR g_O;
extern const SPLSTR g_negative;
extern const SPLSTR g_decimalpoint;
extern const SPLSTR g_to;
extern const SPLSTR g_a;
extern const SPLSTR g_of;
extern const SPLSTR g_percent;
extern const SPLSTR g_degree;
extern const SPLSTR g_degrees;
extern const SPLSTR g_squared;
extern const SPLSTR g_cubed;
extern const SPLSTR g_ones[10];
extern const SPLSTR g_tens[10];
extern const SPLSTR g_teens[10];
extern const SPLSTR g_onesOrdinal[10];
extern const SPLSTR g_tensOrdinal[10];
extern const SPLSTR g_teensOrdinal[10];
extern const SPLSTR g_quantifiers[6];
extern const SPLSTR g_quantifiersOrdinal[6];
extern const SPLSTR g_dash;
extern WCHAR g_Euro[2];
struct CurrencySign
{
SPLSTR Sign;
SPLSTR MainUnit;
SPLSTR SecondaryUnit;
};
struct StateStruct
{
SPLSTR Abbreviation;
SPLSTR FullName;
};
extern const StateStruct g_StateAbbreviations[63];
extern const CurrencySign g_CurrencySigns[14];
extern const SPLSTR g_SingularPrimaryCurrencySigns[14];
extern const SPLSTR g_SingularSecondaryCurrencySigns[14];
extern const WCHAR g_DateDelimiters[3];
extern const SPLSTR g_months[12];
extern const SPLSTR g_monthAbbreviations[13];
extern const SPLSTR g_days[7];
extern const SPLSTR g_dayAbbreviations[10];
extern const SPLSTR g_Area;
extern const SPLSTR g_Country;
extern const SPLSTR g_Code;
extern const SPLSTR g_Half;
extern const SPLSTR g_Tenths;
extern const SPLSTR g_Sixteenths;
extern const SPLSTR g_Hundredths;
extern const SPLSTR g_Over;
extern const SPLSTR g_PluralDenominators[10];
extern const SPLSTR g_A;
extern const SPLSTR g_M;
extern const SPLSTR g_P;
extern const SPLSTR g_OClock;
extern const SPLSTR g_hundred;
extern const SPLSTR g_hour;
extern const SPLSTR g_hours;
extern const SPLSTR g_minute;
extern const SPLSTR g_minutes;
extern const SPLSTR g_second;
extern const SPLSTR g_seconds;
extern const SPLSTR g_ANSICharacterProns[256];
extern const SPVSTATE g_DefaultXMLState;
extern const SPLSTR g_And;
extern const SPLSTR g_comma;
extern const SPLSTR g_period;
extern const SPLSTR g_periodString;
extern const SPLSTR g_slash;
extern const SPLSTR g_Decades[];
extern const SPLSTR g_Zeroes;
extern const SPLSTR g_Hundreds;
#define DAYMAX 31
#define DAYMIN 1
#define MONTHMAX 12
#define MONTHMIN 1
#define YEARMAX 9999
#define YEARMIN 0
#define HOURMIN 1
#define HOURMAX 23
#define MINUTEMIN 0
#define MINUTEMAX 59
#define SECONDMIN 0
#define SECONDMAX 59
//--- POS Tagger Constants - see MiscData.cpp
typedef enum TEMPLATETYPE
{
PREV1T,
NEXT1T,
PREV2T,
NEXT2T,
PREV1OR2T,
NEXT1OR2T,
PREV1OR2OR3T,
NEXT1OR2OR3T,
PREV1TNEXT1T,
PREV1TNEXT2T,
PREV2TNEXT1T,
NOTCAP,
CAP,
PREVNOTCAP,
PREVCAP,
PREV1W,
NEXT1W,
PREV2W,
NEXT2W,
PREV1OR2W,
NEXT1OR2W,
CURRWPREV1W,
CURRWNEXT1W,
CURRWPREV1T,
CURRWNEXT1T,
CURRW,
PREV1WT,
NEXT1WT,
CURRWPREV1WT,
CURRWNEXT1WT
} TEMPLATETYPE;
struct BrillPatch
{
ENGPARTOFSPEECH eCurrentPOS;
ENGPARTOFSPEECH eConvertToPOS;
TEMPLATETYPE eTemplateType;
ENGPARTOFSPEECH eTemplatePOS1;
ENGPARTOFSPEECH eTemplatePOS2;
const WCHAR* pTemplateWord1;
const WCHAR* pTemplateWord2;
};
extern const BrillPatch g_POSTaggerPatches [63];
//=== Class, Enum, Struct and Union Declarations ===================
typedef CSPList<TTSWord,TTSWord&> CWordList;
typedef CSPList<TTSSentItem,TTSSentItem&> CItemList;
//--- Structs used for normalization
typedef enum
{
PRECEDING,
FOLLOWING,
UNATTACHED
} NORM_POSITION;
struct NumberGroup
{
BOOL fOnes; // "one" through "nineteen"
BOOL fTens; // "twenty" through "ninety"
BOOL fHundreds; // "one hundred" through "nine hundred"
BOOL fQuantifier; // "thousand" through "quadrillion"
};
struct TTSIntegerItemInfo
{
long lNumGroups;
NumberGroup Groups[6];
BOOL fOrdinal;
BOOL fDigitByDigit;
ULONG ulNumDigits;
//--- Normalization internal only
long lLeftOver;
BOOL fSeparators;
const WCHAR* pStartChar;
const WCHAR* pEndChar;
};
struct TTSDigitsItemInfo : TTSItemInfo
{
const WCHAR* pFirstDigit;
ULONG ulNumDigits;
};
struct TTSNumberItemInfo;
struct TTSFractionItemInfo
{
BOOL fIsStandard;
TTSNumberItemInfo* pNumerator;
TTSNumberItemInfo* pDenominator;
//--- Normalization internal only
const WCHAR* pVulgar;
};
struct TTSNumberItemInfo : TTSItemInfo
{
BOOL fNegative;
TTSIntegerItemInfo* pIntegerPart;
TTSDigitsItemInfo* pDecimalPart;
TTSFractionItemInfo* pFractionalPart;
//--- Normalization internal only
const WCHAR* pStartChar;
const WCHAR* pEndChar;
CWordList* pWordList;
};
struct TTSPhoneNumberItemInfo : TTSItemInfo
{
//--- Country code members
TTSNumberItemInfo* pCountryCode;
//--- Area code members
TTSDigitsItemInfo* pAreaCode;
BOOL fIs800;
BOOL fOne;
//--- Main number members
TTSDigitsItemInfo** ppGroups;
ULONG ulNumGroups;
};
struct TTSZipCodeItemInfo : TTSItemInfo
{
TTSDigitsItemInfo* pFirstFive;
TTSDigitsItemInfo* pLastFour;
};
struct TTSStateAndZipCodeItemInfo : TTSItemInfo
{
TTSZipCodeItemInfo* pZipCode;
};
struct TTSCurrencyItemInfo : TTSItemInfo
{
TTSNumberItemInfo* pPrimaryNumberPart;
TTSNumberItemInfo* pSecondaryNumberPart;
BOOL fQuantifier;
long lNumPostNumberStates;
long lNumPostSymbolStates;
};
struct TTSYearItemInfo : TTSItemInfo
{
const WCHAR* pYear;
ULONG ulNumDigits;
};
struct TTSRomanNumeralItemInfo : TTSItemInfo
{
TTSItemInfo* pNumberInfo;
};
struct TTSDecadeItemInfo : TTSItemInfo
{
const WCHAR* pCentury;
ULONG ulDecade;
};
struct TTSDateItemInfo : TTSItemInfo
{
ULONG ulDayIndex;
ULONG ulMonthIndex;
TTSIntegerItemInfo* pDay;
TTSYearItemInfo* pYear;
};
typedef enum
{
AM,
PM,
UNDEFINED
} TIMEABBREVIATION;
struct TTSTimeOfDayItemInfo : TTSItemInfo
{
BOOL fTimeAbbreviation;
BOOL fTwentyFourHour;
BOOL fMinutes;
};
struct TTSTimeItemInfo : TTSItemInfo
{
TTSNumberItemInfo* pHours;
TTSNumberItemInfo* pMinutes;
const WCHAR* pSeconds;
};
struct TTSHyphenatedStringInfo : TTSItemInfo
{
TTSItemInfo* pFirstChunkInfo;
TTSItemInfo* pSecondChunkInfo;
const WCHAR* pFirstChunk;
const WCHAR* pSecondChunk;
};
struct TTSSuffixItemInfo : TTSItemInfo
{
const WCHAR* pFirstChar;
ULONG ulNumChars;
};
struct TTSNumberRangeItemInfo : TTSItemInfo
{
TTSItemInfo *pFirstNumberInfo;
TTSItemInfo *pSecondNumberInfo;
};
struct TTSTimeRangeItemInfo : TTSItemInfo
{
TTSTimeOfDayItemInfo *pFirstTimeInfo;
TTSTimeOfDayItemInfo *pSecondTimeInfo;
};
struct AbbrevRecord
{
const WCHAR* pOrth;
WCHAR* pPron1;
ENGPARTOFSPEECH POS1;
WCHAR* pPron2;
ENGPARTOFSPEECH POS2;
WCHAR* pPron3;
ENGPARTOFSPEECH POS3;
int iSentBreakDisambig;
int iPronDisambig;
};
struct TTSAbbreviationInfo : TTSItemInfo
{
const AbbrevRecord* pAbbreviation;
};
//--- Structs used for Lex Lookup
typedef enum { PRON_A = 0, PRON_B = 1 };
struct PRONUNIT
{
ULONG phon_Len;
WCHAR phon_Str[SP_MAX_PRON_LENGTH]; // Allo string
ULONG POScount;
ENGPARTOFSPEECH POScode[POS_MAX];
};
struct PRONRECORD
{
WCHAR orthStr[SP_MAX_WORD_LENGTH]; // Orth text
WCHAR lemmaStr[SP_MAX_WORD_LENGTH]; // Root word
ULONG pronType; // Pronunciation is lex or LTS
PRONUNIT pronArray[2];
ENGPARTOFSPEECH POSchoice;
ENGPARTOFSPEECH XMLPartOfSpeech;
bool hasAlt;
ULONG altChoice;
BOOL fUsePron;
};
//--- Miscellaneous structs and typedefs
struct SentencePointer
{
const WCHAR *pSentenceStart;
const SPVTEXTFRAG *pSentenceFrag;
};
//=== Function Definitions ===========================================
// Misc Number Normalization functions and helpers
int MatchCurrencySign( const WCHAR*& pStartChar, const WCHAR*& pEndChar, NORM_POSITION& ePosition );
//=== Classes
/*** CSentenceStack *************************************************
* This class is used to maintain a stack of sentences for the Skip
* call to utilize.
*/
class CSentenceStack
{
public:
/*--- Methods ---*/
CSentenceStack() { m_StackPtr = -1; }
int GetCount( void ) { return m_StackPtr + 1; }
virtual SentencePointer& Pop( void ) { SPDBG_ASSERT( m_StackPtr > -1 ); return m_Stack[m_StackPtr--]; }
virtual HRESULT Push( const SentencePointer& val ) { ++m_StackPtr; return m_Stack.SetAtGrow( m_StackPtr, val ); }
virtual void Reset( void ) { m_StackPtr = -1; }
protected:
/*--- Member data ---*/
CSPArray<SentencePointer,SentencePointer> m_Stack;
int m_StackPtr;
};
/*** CSentItem
* This object is a helper class
*/
class CSentItem : public TTSSentItem
{
public:
CSentItem() { memset( this, 0, sizeof(*this) ); }
CSentItem( TTSSentItem& Other ) { memcpy( this, &Other, sizeof( Other ) ); }
};
/*** CSentItemEnum
* This object is designed to be used by a single thread.
*/
class ATL_NO_VTABLE CSentItemEnum :
public CComObjectRootEx<CComMultiThreadModel>,
public IEnumSENTITEM
{
/*=== ATL Setup ===*/
public:
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CSentItemEnum)
COM_INTERFACE_ENTRY(IEnumSENTITEM)
END_COM_MAP()
/*=== Methods =======*/
public:
/*--- Constructors/Destructors ---*/
/*--- Non interface methods ---*/
void _SetOwner( IUnknown* pOwner ) { m_cpOwner = pOwner; }
CItemList& _GetList( void ) { return m_ItemList; }
CSentItemMemory& _GetMemoryManager( void ) { return m_MemoryManager; }
/*=== Interfaces ====*/
public:
//--- IEnumSpSentence ----------------------------------------
STDMETHOD(Next)( TTSSentItem *pItemEnum );
STDMETHOD(Reset)( void );
/*=== Member data ===*/
private:
CComPtr<IUnknown> m_cpOwner;
CItemList m_ItemList;
SPLISTPOS m_ListPos;
CSentItemMemory m_MemoryManager;
};
/*** CStdSentEnum COM object
*/
class ATL_NO_VTABLE CStdSentEnum :
public CComObjectRootEx<CComMultiThreadModel>,
public IEnumSpSentence
{
/*=== ATL Setup ===*/
public:
DECLARE_GET_CONTROLLING_UNKNOWN()
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CStdSentEnum)
COM_INTERFACE_ENTRY(IEnumSpSentence)
END_COM_MAP()
/*=== Methods =======*/
public:
/*--- Constructors/Destructors ---*/
HRESULT FinalConstruct();
void FinalRelease();
/*--- Non interface methods ---*/
HRESULT InitAggregateLexicon( void );
HRESULT AddLexiconToAggregate( ISpLexicon *pAddLexicon, DWORD dwFlags );
HRESULT InitMorphLexicon( void );
//--- Abbreviation Sentence Breaking Disambiguation Functions
HRESULT IsAbbreviationEOS( const AbbrevRecord* pAbbreviation, CItemList& ItemList, SPLISTPOS ItemPos,
CSentItemMemory& MemoryManager, BOOL* pfIsEOS );
HRESULT IfEOSNotAbbreviation( const AbbrevRecord* pAbbreviation, CItemList& ItemList, SPLISTPOS ItemPos,
CSentItemMemory& MemoryManager, BOOL* pfIsEOS );
HRESULT IfEOSAndLowercaseNotAbbreviation( const AbbrevRecord* pAbbreviation, CItemList& ItemList, SPLISTPOS ItemPos,
CSentItemMemory& MemoryManager, BOOL* pfIsEOS );
//--- Abbreviation Pronunciation Disambiguation Functions
HRESULT SingleOrPluralAbbreviation( const AbbrevRecord* pAbbrevInfo, PRONRECORD* pPron,
CItemList& ItemList, SPLISTPOS ListPos );
HRESULT DoctorDriveAbbreviation( const AbbrevRecord* pAbbrevInfo, PRONRECORD* pPron,
CItemList& ItemList, SPLISTPOS ListPos );
HRESULT AbbreviationFollowedByDigit( const AbbrevRecord* pAbbrevInfo, PRONRECORD* pPron,
CItemList& ItemList, SPLISTPOS ListPos );
HRESULT AllCapsAbbreviation( const AbbrevRecord* pAbbrevInfo, PRONRECORD* pPron,
CItemList& ItemList, SPLISTPOS ListPos );
HRESULT CapitalizedAbbreviation( const AbbrevRecord* pAbbrevInfo, PRONRECORD* pPron,
CItemList& ItemList, SPLISTPOS ListPos );
HRESULT SECAbbreviation( const AbbrevRecord* pAbbrevInfo, PRONRECORD* pPron,
CItemList& ItemList, SPLISTPOS ListPos );
HRESULT DegreeAbbreviation( const AbbrevRecord* pAbbrevInfo, PRONRECORD* pPron,
CItemList& ItemList, SPLISTPOS ListPos );
HRESULT AbbreviationModifier( const AbbrevRecord* pAbbrevInfo, PRONRECORD* pPron,
CItemList& ItemList, SPLISTPOS ListPos );
HRESULT ADisambig( const AbbrevRecord* pAbbrevInfo, PRONRECORD* pPron,
CItemList& ItemList, SPLISTPOS ListPos );
HRESULT PolishDisambig( const AbbrevRecord* pAbbrevInfo, PRONRECORD* pPron,
CItemList& ItemList, SPLISTPOS ListPos );
//--- Word Pronunciation Disambiguation Functions
HRESULT MeasurementDisambig( const AbbrevRecord* pAbbrevInfo, CItemList& ItemList,
SPLISTPOS ListPos, CSentItemMemory& MemoryManager );
HRESULT TheDisambig( const AbbrevRecord* pAbbrevInfo, CItemList& ItemList,
SPLISTPOS ListPos, CSentItemMemory& MemoryManager );
HRESULT ReadDisambig( const AbbrevRecord* pAbbrevInfo, CItemList& ItemList,
SPLISTPOS ListPos, CSentItemMemory& MemoryManager );
private:
//--- Pronunciation Table init helper
HRESULT InitPron( WCHAR** OriginalPron );
//--- Sentence breaking helpers ---//
HRESULT GetNextSentence( IEnumSENTITEM** pItemEnum );
HRESULT AddNextSentItem( CItemList& ItemList, CSentItemMemory& MemoryManager, BOOL* pfIsEOS );
HRESULT SkipWhiteSpaceAndTags( const WCHAR*& pStartChar, const WCHAR*& pEndChar,
const SPVTEXTFRAG*& pCurrFrag, CSentItemMemory& pMemoryManager,
BOOL fAddToItemList = false, CItemList* pItemList = NULL );
const WCHAR* FindTokenEnd( const WCHAR* pStartChar, const WCHAR* pEndChar );
//--- Lexicon and POS helpers ---//
HRESULT DetermineProns( CItemList& ItemList, CSentItemMemory& MemoryManager );
HRESULT Pronounce( PRONRECORD *pPron );
//--- Normalization helpers ---//
HRESULT Normalize( CItemList& ItemList, SPLISTPOS ListPos, CSentItemMemory& MemoryManager );
HRESULT MatchCategory( TTSItemInfo*& pItemNormInfo, CSentItemMemory& MemoryManager, CWordList& WordList );
HRESULT ExpandCategory( TTSItemInfo*& pItemNormInfo, CItemList& ItemList, SPLISTPOS ListPos,
CSentItemMemory& MemoryManager );
HRESULT DoUnicodeToAsciiMap( const WCHAR *pUnicodeString, ULONG ulUnicodeStringLength,
WCHAR *ppConvertedString );
HRESULT IsAlphaWord( const WCHAR* pStartChar, const WCHAR* pEndChar, TTSItemInfo*& pItemNormInfo,
CSentItemMemory& MemoryManager );
HRESULT IsInitialism( CItemList& ItemList, SPLISTPOS ItemPos, CSentItemMemory& MemoryManager,
BOOL* pfIsEOS );
//--- Various Number Related Normalization helpers ---//
HRESULT IsNumberCategory( TTSItemInfo*& pItemNormInfo, const WCHAR* Context, CSentItemMemory& MemoryManager );
HRESULT IsNumber( TTSItemInfo*& pItemNormInfo, const WCHAR* Context, CSentItemMemory& MemoryManager,
BOOL fMultiItem = true );
HRESULT IsInteger( const WCHAR* pStartChar, TTSIntegerItemInfo*& pIntegerInfo,
CSentItemMemory& MemoryManager );
HRESULT IsDigitString( const WCHAR* pStartChar, TTSDigitsItemInfo*& pDigitsInfo,
CSentItemMemory& MemoryManager );
HRESULT ExpandNumber( TTSNumberItemInfo* pItemInfo, CWordList& WordList );
HRESULT ExpandPercent( TTSNumberItemInfo* pItemInfo, CWordList& WordList );
HRESULT ExpandDegrees( TTSNumberItemInfo* pItemInfo, CWordList& WordList );
HRESULT ExpandSquare( TTSNumberItemInfo* pItemInfo, CWordList& WordList );
HRESULT ExpandCube( TTSNumberItemInfo* pItemInfo, CWordList& WordList );
void ExpandInteger( TTSIntegerItemInfo* pItemInfo, const WCHAR* Context, CWordList &WordList );
void ExpandDigit( const WCHAR Number, NumberGroup& NormGroupInfo, CWordList& WordList );
void ExpandTwoDigits( const WCHAR* NumberString, NumberGroup& NormGroupInfo, CWordList& WordList );
void ExpandThreeDigits( const WCHAR* NumberString, NumberGroup& NormGroupInfo, CWordList& WordList );
void ExpandDigitOrdinal( const WCHAR Number, NumberGroup& NormGroupInfo, CWordList& WordList );
void ExpandTwoOrdinal( const WCHAR* NumberString, NumberGroup& NormGroupInfo, CWordList& WordList );
void ExpandThreeOrdinal( const WCHAR* NumberString, NumberGroup& NormGroupInfo, CWordList& WordList );
void ExpandDigits( TTSDigitsItemInfo* pItemInfo, CWordList& WordList );
HRESULT IsFraction( const WCHAR* pStartChar, TTSFractionItemInfo*& pItemNormInfo, CSentItemMemory& MemoryManager );
HRESULT ExpandFraction( TTSFractionItemInfo* pItemInfo, CWordList& WordList );
HRESULT IsRomanNumeral( TTSItemInfo*& pItemNormInfo, const WCHAR* Context, CSentItemMemory& MemoryManager );
HRESULT IsPhoneNumber( TTSItemInfo*& pItemNormInfo, const WCHAR* Context, CSentItemMemory& MemoryManager, CWordList& WordList );
HRESULT IsZipCode( TTSItemInfo*& pItemNormInfo, const WCHAR* Context, CSentItemMemory& MemoryManager );
HRESULT ExpandZipCode( TTSZipCodeItemInfo* pItemInfo, CWordList& WordList );
HRESULT IsCurrency( TTSItemInfo*& pItemNormInfo, CSentItemMemory& MemoryManager,
CWordList& WordList );
HRESULT IsNumberRange( TTSItemInfo*& pItemNormInfo, CSentItemMemory& MemoryManager );
HRESULT ExpandNumberRange( TTSNumberRangeItemInfo* pItemInfo, CWordList& WordList );
HRESULT IsCurrencyRange( TTSItemInfo*& pItemInfo, CSentItemMemory& MemoryManager, CWordList& WordList );
//--- Date Related Normalization helpers ---//
HRESULT IsNumericCompactDate( TTSItemInfo*& pItemNormInfo, const WCHAR* Context,
CSentItemMemory& MemoryManager );
HRESULT IsMonthStringCompactDate( TTSItemInfo*& pItemNormInfo, const WCHAR* Context,
CSentItemMemory& MemoryManager );
HRESULT IsLongFormDate_DMDY( TTSItemInfo*& pItemNormInfo, CSentItemMemory& MemoryManager, CWordList& WordList );
HRESULT IsLongFormDate_DDMY( TTSItemInfo*& pItemNormInfo, CSentItemMemory& MemoryManager, CWordList& WordList );
HRESULT ExpandDate( TTSDateItemInfo* pItemInfo, CWordList& WordList );
HRESULT ExpandYear( TTSYearItemInfo* pItemInfo, CWordList& WordList );
HRESULT IsDecade( TTSItemInfo*& pItemNormInfo, CSentItemMemory& MemoryManager );
HRESULT ExpandDecade( TTSDecadeItemInfo* pItemInfo, CWordList& WordList );
ULONG MatchMonthString( WCHAR*& pMonth, ULONG ulLength );
ULONG MatchDayString( WCHAR*& pDayString, WCHAR* pEndChar );
bool MatchDateDelimiter( WCHAR **DateString );
//--- Time Related Normalization helpers ---//
HRESULT IsTimeOfDay( TTSItemInfo*& pItemNormInfo, CSentItemMemory& MemoryManager, CWordList& WordList, BOOL fMultiItem = true );
HRESULT IsTime( TTSItemInfo*& pItemNormInfo, const WCHAR* Context, CSentItemMemory& MemoryManager );
HRESULT ExpandTime( TTSTimeItemInfo* pItemInfo, CWordList& WordList );
HRESULT IsTimeRange( TTSItemInfo*& pItemNormInfo, CSentItemMemory& MemoryManager, CWordList& WordList );
//--- SPELL tag normalization helper
HRESULT SpellOutString( CWordList& WordList );
void ExpandPunctuation( CWordList& WordList, WCHAR wc );
//--- Default normalization helper
HRESULT ExpandUnrecognizedString( CWordList& WordList, CSentItemMemory& MemoryManager );
//--- Misc. normalization helpers
HRESULT IsStateAndZipcode( TTSItemInfo*& pItemNormInfo, CSentItemMemory& MemoryManager, CWordList& WordList );
HRESULT IsHyphenatedString( const WCHAR* pStartChar, const WCHAR* pEndChar, TTSItemInfo*& pItemNormInfo,
CSentItemMemory& MemoryManager );
HRESULT ExpandHyphenatedString( TTSHyphenatedStringInfo* pItemInfo, CWordList& WordList );
HRESULT IsSuffix( const WCHAR* pStartChar, const WCHAR* pEndChar, TTSItemInfo*& pItemNormInfo,
CSentItemMemory& MemoryManager );
HRESULT ExpandSuffix( TTSSuffixItemInfo* pItemInfo, CWordList& WordList );
bool Zeroes( const WCHAR* );
bool ThreeZeroes( const WCHAR* );
bool IsPunctuation(const TTSSentItem *Item);
/*=== Interfaces ====*/
public:
//--- IEnumSpSentence ----------------------------------------
STDMETHOD(SetFragList)( const SPVTEXTFRAG* pTextFragList, DWORD dwFlags );
STDMETHOD(Next)( IEnumSENTITEM **ppSentItemEnum );
STDMETHOD(Previous)( IEnumSENTITEM **ppSentItemEnum );
STDMETHOD(Reset)( void );
//=== Data members ===
private:
CComPtr<ISpContainerLexicon> m_cpAggregateLexicon;
CComPtr<ISpPhoneConverter> m_cpPhonemeConverter;
CSMorph* m_pMorphLexicon;
DWORD m_dwSpeakFlags;
const SPVTEXTFRAG* m_pTextFragList;
const SPVTEXTFRAG* m_pCurrFrag;
const WCHAR* m_pNextChar;
const WCHAR* m_pEndChar;
const WCHAR* m_pEndOfCurrToken;
const WCHAR* m_pEndOfCurrItem;
CSentenceStack m_SentenceStack;
SEPARATOR_AND_DECIMAL m_eSeparatorAndDecimal;
SHORT_DATE_ORDER m_eShortDateOrder;
static CComAutoCriticalSection m_AbbrevTableCritSec;
};
//--- Structs and typedefs used for abbreviation stuff
typedef HRESULT (CStdSentEnum::* SentBreakDisambigFunc)(const AbbrevRecord*, CItemList& , SPLISTPOS,
CSentItemMemory&, BOOL*);
typedef HRESULT (CStdSentEnum::* PronDisambigFunc) ( const AbbrevRecord*, PRONRECORD*, CItemList&, SPLISTPOS );
typedef HRESULT (CStdSentEnum::* PostLexLookupDisambigFunc) ( const AbbrevRecord*, CItemList&, SPLISTPOS, CSentItemMemory& );
extern AbbrevRecord g_AbbreviationTable[177];
extern const PronDisambigFunc g_PronDisambigTable[];
extern const SentBreakDisambigFunc g_SentBreakDisambigTable[];
extern AbbrevRecord g_AmbiguousWordTable[72];
extern const PronDisambigFunc g_AmbiguousWordDisambigTable[];
extern AbbrevRecord g_PostLexLookupWordTable[41];
extern const PostLexLookupDisambigFunc g_PostLexLookupDisambigTable[];
extern WCHAR *g_pOfA;
extern WCHAR *g_pOfAn;
extern BOOL g_fAbbrevTablesInitialized;
extern void CleanupAbbrevTables( void );
//--- First words table - used in sentence breaking
extern const SPLSTR g_FirstWords[163];
//
//=== Inlines
//
inline ULONG my_wcstoul( const WCHAR *pStartChar, WCHAR **ppEndChar )
{
if ( iswdigit( *pStartChar ) )
{
return wcstoul( pStartChar, ppEndChar, 10 );
}
else
{
if ( ppEndChar )
{
*ppEndChar = (WCHAR*) pStartChar;
}
return 0;
}
}
inline ENGPARTOFSPEECH ConvertItemTypeToPartOfSp( TTSItemType ItemType )
{
switch ( ItemType )
{
case eOPEN_PARENTHESIS:
case eOPEN_BRACKET:
case eOPEN_BRACE:
return MS_GroupBegin;
case eCLOSE_PARENTHESIS:
case eCLOSE_BRACKET:
case eCLOSE_BRACE:
return MS_GroupEnd;
case eSINGLE_QUOTE:
case eDOUBLE_QUOTE:
return MS_Quotation;
case ePERIOD:
case eQUESTION:
case eEXCLAMATION:
return MS_EOSItem;
case eCOMMA:
case eCOLON:
case eSEMICOLON:
case eHYPHEN:
case eELLIPSIS:
return MS_MiscPunc;
default:
return MS_Unknown;
}
}
inline bool MatchPhoneNumberDelimiter( const WCHAR wc )
{
return ( wc == L' ' || wc == L'-' || wc == L'.' );
}
inline bool NeedsToBeNormalized( const AbbrevRecord* pAbbreviation )
{
if( !wcscmp( pAbbreviation->pOrth, L"jan" ) ||
!wcscmp( pAbbreviation->pOrth, L"feb" ) ||
!wcscmp( pAbbreviation->pOrth, L"mar" ) ||
!wcscmp( pAbbreviation->pOrth, L"apr" ) ||
!wcscmp( pAbbreviation->pOrth, L"jun" ) ||
!wcscmp( pAbbreviation->pOrth, L"jul" ) ||
!wcscmp( pAbbreviation->pOrth, L"aug" ) ||
!wcscmp( pAbbreviation->pOrth, L"sep" ) ||
!wcscmp( pAbbreviation->pOrth, L"sept" ) ||
!wcscmp( pAbbreviation->pOrth, L"oct" ) ||
!wcscmp( pAbbreviation->pOrth, L"nov" ) ||
!wcscmp( pAbbreviation->pOrth, L"dec" ) ||
!wcscmp( pAbbreviation->pOrth, L"mon" ) ||
!wcscmp( pAbbreviation->pOrth, L"tue" ) ||
!wcscmp( pAbbreviation->pOrth, L"tues" ) ||
!wcscmp( pAbbreviation->pOrth, L"wed" ) ||
!wcscmp( pAbbreviation->pOrth, L"thu" ) ||
!wcscmp( pAbbreviation->pOrth, L"thur" ) ||
!wcscmp( pAbbreviation->pOrth, L"thurs" ) ||
!wcscmp( pAbbreviation->pOrth, L"fri" ) ||
!wcscmp( pAbbreviation->pOrth, L"sat" ) ||
!wcscmp( pAbbreviation->pOrth, L"sun" ) )
{
return true;
}
else
{
return false;
}
}
inline HRESULT SetWordList( CSentItem& Item, CWordList& WordList, CSentItemMemory& MemoryManager )
{
HRESULT hr = S_OK;
SPLISTPOS WordListPos = WordList.GetHeadPosition();
Item.ulNumWords = WordList.GetCount();
Item.Words = (TTSWord*) MemoryManager.GetMemory( Item.ulNumWords * sizeof(TTSWord), &hr );
if ( SUCCEEDED( hr ) )
{
ULONG ulIndex = 0;
while ( WordListPos )
{
SPDBG_ASSERT( ulIndex < Item.ulNumWords );
Item.Words[ulIndex++] = WordList.GetNext( WordListPos );
}
}
return hr;
}
inline int CompareStringAndSPLSTR( const void* _String, const void* _SPLSTR )
{
int _StringLen = wcslen( (const WCHAR*) _String );
int _SPLSTRLen = ( (const SPLSTR*) _SPLSTR )->Len;
if ( _StringLen < _SPLSTRLen )
{
int Result = wcsnicmp( (const WCHAR*) _String , ( (const SPLSTR*) _SPLSTR )->pStr, _StringLen );
if ( Result != 0 )
{
return Result;
}
else
{
return -1;
}
}
else if ( _StringLen > _SPLSTRLen )
{
int Result = wcsnicmp( (const WCHAR*) _String , ( (const SPLSTR*) _SPLSTR )->pStr, _SPLSTRLen );
if ( Result != 0 )
{
return Result;
}
else
{
return 1;
}
}
else
{
return ( wcsnicmp( (const WCHAR*) _String , ( (const SPLSTR*) _SPLSTR )->pStr, _StringLen ) );
}
}
inline int CompareStringAndStateStruct( const void* _String, const void* _StateStruct )
{
int _StringLen = wcslen( (const WCHAR*) _String );
int _StateStructLen = ( (const StateStruct*) _StateStruct )->Abbreviation.Len;
if ( _StringLen < _StateStructLen )
{
int Result = wcsnicmp( (const WCHAR*) _String , ( (const StateStruct*) _StateStruct )->Abbreviation.pStr,
_StringLen );
if ( Result != 0 )
{
return Result;
}
else
{
return -1;
}
}
else if ( _StringLen > _StateStructLen )
{
int Result = wcsnicmp( (const WCHAR*) _String , ( (const StateStruct*) _StateStruct )->Abbreviation.pStr,
_StateStructLen );
if ( Result != 0 )
{
return Result;
}
else
{
return 1;
}
}
else
{
return ( wcsnicmp( (const WCHAR*) _String , ( (const StateStruct*) _StateStruct )->Abbreviation.pStr,
_StringLen ) );
}
}
inline int CompareStringAndAbbrevRecord( const void* _String, const void* _AbbrevRecord )
{
return ( _wcsicmp( (const WCHAR*) _String, ( (const AbbrevRecord*) _AbbrevRecord )->pOrth ) );
}
inline int CompareWCHARAndWCHAR( const void *pWCHAR_1, const void *pWCHAR_2 )
{
return ( *( (WCHAR*) pWCHAR_1) - *( (WCHAR*) pWCHAR_2) );
}
inline BOOL IsSpace( WCHAR wc )
{
return ( ( wc == 0x20 ) || ( wc == 0x9 ) || ( wc == 0xD ) ||
( wc == 0xA ) || ( wc == 0x200B ) );
}
inline BOOL IsCapital( WCHAR wc )
{
return ( ( wc >= L'A' ) && ( wc <= L'Z' ) );
}
inline TTSItemType IsGroupBeginning( WCHAR wc )
{
if ( wc == L'(' )
{
return eOPEN_PARENTHESIS;
}
else if ( wc == L'[' )
{
return eOPEN_BRACKET;
}
else if ( wc == L'{' )
{
return eOPEN_BRACE;
}
else
{
return eUNMATCHED;
}
}
inline TTSItemType IsGroupEnding( WCHAR wc )
{
if ( wc == L')' )
{
return eCLOSE_PARENTHESIS;
}
else if ( wc == L']' )
{
return eCLOSE_BRACKET;
}
else if ( wc == L'}' )
{
return eCLOSE_BRACE;
}
else
{
return eUNMATCHED;
}
}
inline TTSItemType IsQuotationMark( WCHAR wc )
{
if ( wc == L'\'' )
{
return eSINGLE_QUOTE;
}
else if ( wc == L'\"' )
{
return eDOUBLE_QUOTE;
}
else
{
return eUNMATCHED;
}
}
inline TTSItemType IsEOSItem( WCHAR wc )
{
if ( wc == L'.' )
{
return ePERIOD;
}
else if ( wc == L'!' )
{
return eEXCLAMATION;
}
else if ( wc == L'?' )
{
return eQUESTION;
}
else
{
return eUNMATCHED;
}
}
inline TTSItemType IsMiscPunctuation( WCHAR wc )
{
if ( wc == L',' )
{
return eCOMMA;
}
else if ( wc == L';' )
{
return eSEMICOLON;
}
else if ( wc == L':' )
{
return eCOLON;
}
else if ( wc == L'-' )
{
return eHYPHEN;
}
else
{
return eUNMATCHED;
}
}
#endif //--- This must be the last line in the file