diff options
Diffstat (limited to 'Build/source/libs/teckit/TECkit-2.5.1/source/Engine.h')
-rw-r--r-- | Build/source/libs/teckit/TECkit-2.5.1/source/Engine.h | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/Build/source/libs/teckit/TECkit-2.5.1/source/Engine.h b/Build/source/libs/teckit/TECkit-2.5.1/source/Engine.h new file mode 100644 index 00000000000..171da1d4504 --- /dev/null +++ b/Build/source/libs/teckit/TECkit-2.5.1/source/Engine.h @@ -0,0 +1,224 @@ +/*------------------------------------------------------------------------ +Copyright (C) 2002 SIL International. All rights reserved. + +Distributable under the terms of either the Common Public License or the +GNU Lesser General Public License, as specified in the LICENSING.txt file. + +File: Engine.h +Responsibility: Jonathan Kew +Last reviewed: Not yet. + +Description: + internal header for the TECkit mapping engine +-------------------------------------------------------------------------*/ + +/* + 2004-03-19 jk updated for version 2.2 with new match() function + 2003-09-23 jk updated for version 2.1 with new Opt APIs +*/ + +#ifndef __Engine_H__ +#define __Engine_H__ + +#include "TECkit_Engine.h" +#include "TECkit_Format.h" + +const UInt32 kNeedMoreInput = 0xfffffffeUL; +const UInt32 kInvalidChar = 0xfffffffdUL; +const UInt32 kUnmappedChar = 0xfffffffcUL; + +class Converter; + +class Stage + /* abstract base class for pipeline stages, both mapping and normalization passes */ +{ +public: + Stage(); + virtual ~Stage(); + + virtual UInt32 getChar() = 0; + + virtual void Reset() = 0; + + virtual UInt32 lookaheadCount() const; + +protected: + friend class Converter; + + UInt32* oBuffer; + long oBufSize; + long oBufEnd; // points to next unused slot in oBuffer + long oBufPtr; // points to next char to be returned to caller (if less than oBufEnd) + + Stage* prevStage; +}; + +class Normalizer + : public Stage +{ +public: + Normalizer(bool compose); + virtual ~Normalizer(); + + virtual UInt32 getChar(); + + virtual void Reset(); + +protected: + UInt32 process(); + + void decompose(UInt32 c); + UInt32 decomposeOne(UInt32& c); + + void compose(); + void generateChar(UInt32 c); + void appendChar(UInt32 c); + void insertChar(UInt32 insCh, int insCombClass); + void growOutBuf(); + + int prevCombClass; + long oBufSafe; + + bool bCompose; +}; + +class Pass + : public Stage +{ +public: + Pass(const TableHeader* inTable, Converter* cnv); + virtual ~Pass(); + + virtual UInt32 getChar(); + + virtual void Reset(); + + virtual UInt32 lookaheadCount() const; + +protected: + UInt32 DoMapping(); + + void outputChar(UInt32 c); + + UInt32 inputChar(long inIndex); + void advanceInput(unsigned int numChars); + + long classMatch(UInt32 classNumber, UInt32 inChar) const; + UInt32 repClassMember(UInt32 classNumber, UInt32 index) const; + + struct MatchInfo { + UInt32 classIndex; + int groupRepeats; + struct { + UInt16 start; + UInt16 limit; + } matchedSpan; + }; + + UInt32 match(int index, int repeats, int textLoc); + // returns 0 for no match, 1 for match, or kNeedMoreInput/kInvalidChar + const MatchElem* pattern; + int patternLength; + int direction; + MatchInfo info[256]; + int infoLimit; + int matchElems; + int matchedLength; + + int groupRepeats; + struct sgrStackItem { + sgrStackItem* link; + int savedGroupRepeats; + }; + sgrStackItem* sgrStack; + + Converter* converter; + const TableHeader* tableHeader; + + const Byte* pageBase; + const Lookup* lookupBase; + const Byte* matchClassBase; + const Byte* repClassBase; + const Byte* stringListBase; + const Byte* stringRuleData; + const Byte* planeMap; + + UInt32* iBuffer; + long iBufSize; + long iBufStart; // points to earliest valid char in iBuffer + long iBufEnd; // points to next unused slot in iBuffer (one past last valid char) + long iBufPtr; // points to next char to be fetched from iBuffer (if less than iBufEnd) + + bool bInputIsUnicode; + bool bOutputIsUnicode; + bool bSupplementaryChars; + UInt8 numPageMaps; +}; + +class Converter + : public Stage +{ +public: + Converter(const Byte* inTable, UInt32 inTableSize, bool inForward, + UInt16 inForm, UInt16 outForm); + ~Converter(); + + TECkit_Status ConvertBufferOpt(const Byte* inBuffer, UInt32 inLength, UInt32* inUsed, + Byte* outBuffer, UInt32 outLength, UInt32* outUsed, + UInt32 inOptions, UInt32* lookaheadCount); + + virtual void Reset(); + + virtual UInt32 getChar(); + + bool IsForward() const; + void GetFlags(UInt32& sourceFlags, UInt32& targetFlags) const; + bool GetNamePtr(UInt16 inNameID, const Byte*& outNamePtr, UInt32& outNameLen) const; + + class Exception + { + public: + Exception(UInt32 errCode) + : errorCode(errCode) + { } + UInt32 errorCode; + }; + + long creationStatus() const + { return status; } + + static bool Validate(const Converter* cnv); + +protected: + friend class Pass; + friend class Normalizer; + + UInt32 _getCharFn(); + UInt32 _getCharWithSavedBytes(); + void _savePendingBytes(); + + Byte* table; + + Stage* finalStage; + + const Byte* data; + UInt32 dataPtr; + UInt32 dataLen; + bool inputComplete; + Byte unmappedBehavior; + + bool forward; + + Byte inputForm; + Byte outputForm; + + Byte savedBytes[8]; + UInt32 savedCount; + + UInt32 pendingOutputChar; + long status; + + UInt32 warningStatus; +}; + +#endif /* __Engine_H__ */ |