1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ******************************************************************************* 3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Copyright (C) 1999-2003, International Business Machines 5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Corporation and others. All Rights Reserved. 6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ******************************************************************************* 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * file name: scrptrun.h 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * created on: 10/17/2001 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * created by: Eric R. Mader 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef __SCRPTRUN_H 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define __SCRPTRUN_H 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h" 18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uobject.h" 19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uscript.h" 20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct ScriptRecord 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar32 startChar; 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar32 endChar; 25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UScriptCode scriptCode; 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct ParenStackEntry 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t pairIndex; 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UScriptCode scriptCode; 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass ScriptRun : public UObject { 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic: 36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ScriptRun(); 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ScriptRun(const UChar chars[], int32_t length); 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ScriptRun(const UChar chars[], int32_t start, int32_t length); 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru void reset(); 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru void reset(int32_t start, int32_t count); 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru void reset(const UChar chars[], int32_t start, int32_t length); 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t getScriptStart(); 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t getScriptEnd(); 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UScriptCode getScriptCode(); 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool next(); 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /** 57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * ICU "poor man's RTTI", returns a UClassID for the actual class. 58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @stable ICU 2.2 60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } 62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /** 64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * ICU "poor man's RTTI", returns a UClassID for this class. 65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @stable ICU 2.2 67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } 69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruprivate: 71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru static UBool sameScript(int32_t scriptOne, int32_t scriptTwo); 73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t charStart; 75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t charLimit; 76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const UChar *charArray; 77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t scriptStart; 79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t scriptEnd; 80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UScriptCode scriptCode; 81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ParenStackEntry parenStack[128]; 83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t parenSP; 84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru static int8_t highBit(int32_t value); 86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru static int32_t getPairIndex(UChar32 ch); 87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru static UChar32 pairedChars[]; 89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru static const int32_t pairedCharCount; 90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru static const int32_t pairedCharPower; 91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru static const int32_t pairedCharExtra; 92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /** 94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * The address of this static class variable serves as this class's ID 95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * for ICU "poor man's RTTI". 96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru static const char fgClassID; 98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; 99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline ScriptRun::ScriptRun() 101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru reset(NULL, 0, 0); 103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline ScriptRun::ScriptRun(const UChar chars[], int32_t length) 106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru reset(chars, 0, length); 108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline ScriptRun::ScriptRun(const UChar chars[], int32_t start, int32_t length) 111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru reset(chars, start, length); 113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline int32_t ScriptRun::getScriptStart() 116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return scriptStart; 118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline int32_t ScriptRun::getScriptEnd() 121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return scriptEnd; 123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline UScriptCode ScriptRun::getScriptCode() 126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return scriptCode; 128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline void ScriptRun::reset() 131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru scriptStart = charStart; 133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru scriptEnd = charStart; 134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru scriptCode = USCRIPT_INVALID_CODE; 135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru parenSP = -1; 136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline void ScriptRun::reset(int32_t start, int32_t length) 139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru charStart = start; 141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru charLimit = start + length; 142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru reset(); 144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline void ScriptRun::reset(const UChar chars[], int32_t start, int32_t length) 147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru charArray = chars; 149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru reset(start, length); 151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 155