16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ******************************************************************************* 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (C) 1999-2003, International Business Machines 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Corporation and others. All Rights Reserved. 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ******************************************************************************* 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * file name: scrptrun.h 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * created on: 10/17/2001 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * created by: Eric R. Mader 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef __SCRPTRUN_H 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define __SCRPTRUN_H 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h" 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uobject.h" 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uscript.h" 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct ScriptRecord 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 startChar; 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 endChar; 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UScriptCode scriptCode; 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct ParenStackEntry 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t pairIndex; 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UScriptCode scriptCode; 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass ScriptRun : public UObject { 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ScriptRun(); 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ScriptRun(const UChar chars[], int32_t length); 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ScriptRun(const UChar chars[], int32_t start, int32_t length); 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void reset(); 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void reset(int32_t start, int32_t count); 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void reset(const UChar chars[], int32_t start, int32_t length); 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t getScriptStart(); 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t getScriptEnd(); 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UScriptCode getScriptCode(); 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool next(); 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ICU "poor man's RTTI", returns a UClassID for the actual class. 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 2.2 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ICU "poor man's RTTI", returns a UClassID for this class. 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 2.2 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate: 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static UBool sameScript(int32_t scriptOne, int32_t scriptTwo); 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t charStart; 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t charLimit; 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *charArray; 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t scriptStart; 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t scriptEnd; 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UScriptCode scriptCode; 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ParenStackEntry parenStack[128]; 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t parenSP; 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static int8_t highBit(int32_t value); 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static int32_t getPairIndex(UChar32 ch); 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static UChar32 pairedChars[]; 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const int32_t pairedCharCount; 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const int32_t pairedCharPower; 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const int32_t pairedCharExtra; 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The address of this static class variable serves as this class's ID 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * for ICU "poor man's RTTI". 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const char fgClassID; 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline ScriptRun::ScriptRun() 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org reset(NULL, 0, 0); 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline ScriptRun::ScriptRun(const UChar chars[], int32_t length) 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org reset(chars, 0, length); 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline ScriptRun::ScriptRun(const UChar chars[], int32_t start, int32_t length) 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org reset(chars, start, length); 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t ScriptRun::getScriptStart() 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return scriptStart; 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t ScriptRun::getScriptEnd() 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return scriptEnd; 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UScriptCode ScriptRun::getScriptCode() 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return scriptCode; 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline void ScriptRun::reset() 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org scriptStart = charStart; 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org scriptEnd = charStart; 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org scriptCode = USCRIPT_INVALID_CODE; 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parenSP = -1; 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline void ScriptRun::reset(int32_t start, int32_t length) 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org charStart = start; 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org charLimit = start + length; 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org reset(); 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline void ScriptRun::reset(const UChar chars[], int32_t start, int32_t length) 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org charArray = chars; 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org reset(start, length); 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 155