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