185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/*
285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho*******************************************************************************
3b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* Copyright (C) 2007-2011, International Business Machines Corporation and
485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho* others. All Rights Reserved.
585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho*******************************************************************************
685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho*
785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho* File PLURRULE_IMPL.H
885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho*
985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho*******************************************************************************
1085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho*/
1185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifndef PLURRULE_IMPLE
1485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define PLURRULE_IMPLE
1585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
16b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho// Internal definitions for the PluralRules implementation.
17b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#if !UCONFIG_NO_FORMATTING
1985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
2085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unicode/format.h"
2185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unicode/locid.h"
2285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unicode/parseerr.h"
2385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unicode/utypes.h"
2485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "uvector.h"
2585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "hash.h"
2685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
2785bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoU_NAMESPACE_BEGIN
2885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
2985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define DOT               ((UChar)0x002E)
3085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define SINGLE_QUOTE      ((UChar)0x0027)
3185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define SLASH             ((UChar)0x002F)
3285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define BACKSLASH         ((UChar)0x005C)
3385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define SPACE             ((UChar)0x0020)
3485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define QUOTATION_MARK    ((UChar)0x0022)
3585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define NUMBER_SIGN       ((UChar)0x0023)
3685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define ASTERISK          ((UChar)0x002A)
3785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define COMMA             ((UChar)0x002C)
3885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define HYPHEN            ((UChar)0x002D)
3985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define U_ZERO            ((UChar)0x0030)
4085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define U_ONE             ((UChar)0x0031)
4185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define U_TWO             ((UChar)0x0032)
4285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define U_THREE           ((UChar)0x0033)
4385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define U_FOUR            ((UChar)0x0034)
4485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define U_FIVE            ((UChar)0x0035)
4585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define U_SIX             ((UChar)0x0036)
4685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define U_SEVEN           ((UChar)0x0037)
4785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define U_EIGHT           ((UChar)0x0038)
4885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define U_NINE            ((UChar)0x0039)
4985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define COLON             ((UChar)0x003A)
5085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define SEMI_COLON        ((UChar)0x003B)
5185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define CAP_A             ((UChar)0x0041)
5285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define CAP_B             ((UChar)0x0042)
5385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define CAP_R             ((UChar)0x0052)
5485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define CAP_Z             ((UChar)0x005A)
5585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LOWLINE           ((UChar)0x005F)
5685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LEFTBRACE         ((UChar)0x007B)
5785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define RIGHTBRACE        ((UChar)0x007D)
5885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
5985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LOW_A             ((UChar)0x0061)
6085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LOW_B             ((UChar)0x0062)
6185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LOW_C             ((UChar)0x0063)
6285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LOW_D             ((UChar)0x0064)
6385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LOW_E             ((UChar)0x0065)
6485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LOW_F             ((UChar)0x0066)
6585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LOW_G             ((UChar)0x0067)
6685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LOW_H             ((UChar)0x0068)
6785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LOW_I             ((UChar)0x0069)
6885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LOW_J             ((UChar)0x006a)
6985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LOW_K             ((UChar)0x006B)
7085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LOW_L             ((UChar)0x006C)
7185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LOW_M             ((UChar)0x006D)
7285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LOW_N             ((UChar)0x006E)
7385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LOW_O             ((UChar)0x006F)
7485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LOW_P             ((UChar)0x0070)
7585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LOW_Q             ((UChar)0x0071)
7685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LOW_R             ((UChar)0x0072)
7785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LOW_S             ((UChar)0x0073)
7885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LOW_T             ((UChar)0x0074)
7985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LOW_U             ((UChar)0x0075)
8085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LOW_V             ((UChar)0x0076)
8185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LOW_W             ((UChar)0x0077)
8285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LOW_Y             ((UChar)0x0079)
8385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LOW_Z             ((UChar)0x007A)
8485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
8585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
8685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define PLURAL_RANGE_HIGH  0x7fffffff;
8785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
8885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
8985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hotypedef enum PluralKey {
9085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  pZero,
9185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  pOne,
9285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  pTwo,
9385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  pFew,
9485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  pMany,
9585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  pOther,
9685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  pLast
9785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}PluralKey;
9885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
9985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hotypedef enum tokenType {
10085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  none,
10185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  tLetter,
10285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  tNumber,
10385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  tComma,
10485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  tSemiColon,
10585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  tSpace,
10685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  tColon,
10785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  tDot,
10885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  tKeyword,
10985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  tZero,
11085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  tOne,
11185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  tTwo,
11285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  tFew,
11385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  tMany,
11485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  tOther,
11585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  tAnd,
11685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  tOr,
11785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  tMod,
11885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  tNot,
11985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  tIn,
12085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  tWithin,
12185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  tNotIn,
12285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  tVariableN,
12385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  tIs,
12485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  tLeftBrace,
12585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  tRightBrace
12685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}tokenType;
12785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
12885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoclass RuleParser : public UMemory {
12985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hopublic:
13085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    RuleParser();
13185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    virtual ~RuleParser();
132b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    void getNextToken(const UnicodeString& ruleData, int32_t *ruleIndex, UnicodeString& token,
13385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                            tokenType& type, UErrorCode &status);
13485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    void checkSyntax(tokenType prevType, tokenType curType, UErrorCode &status);
13585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoprivate:
13685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    void getKeyType(const UnicodeString& token, tokenType& type, UErrorCode &status);
13785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UBool inRange(UChar ch, tokenType& type);
13885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UBool isValidKeyword(const UnicodeString& token);
13985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho};
14085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
14185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoclass AndConstraint : public UMemory  {
14285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hopublic:
14385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    typedef enum RuleOp {
14485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        NONE,
14585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        MOD
14685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    } RuleOp;
14785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    RuleOp  op;
14885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t opNum;
14985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t  rangeLow;
15085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t  rangeHigh;
15185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UBool   notIn;
15285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UBool   integerOnly;
15385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    AndConstraint *next;
154b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
15585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    AndConstraint();
15685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    AndConstraint(const AndConstraint& other);
15785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    virtual ~AndConstraint();
15885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    AndConstraint* add();
15985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UBool isFulfilled(double number);
160b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBool isLimited();
16185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t updateRepeatLimit(int32_t maxLimit);
16285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho};
16385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
16485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoclass OrConstraint : public UMemory  {
16585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hopublic:
16685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    AndConstraint *childNode;
16785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    OrConstraint *next;
16885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    OrConstraint();
169b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
17085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    OrConstraint(const OrConstraint& other);
17185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    virtual ~OrConstraint();
17285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    AndConstraint* add();
17385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UBool isFulfilled(double number);
174b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBool isLimited();
17585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho};
17685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
17785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoclass RuleChain : public UMemory  {
17885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hopublic:
17985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    OrConstraint *ruleHeader;
18085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UnicodeString keyword;
18185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    RuleChain();
18285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    RuleChain(const RuleChain& other);
18385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    RuleChain *next;
184b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
18585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    virtual ~RuleChain();
18685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UnicodeString select(double number) const;
18785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    void dumpRules(UnicodeString& result);
188b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t getRepeatLimit();
189b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBool isLimited();
19085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UErrorCode getKeywords(int32_t maxArraySize, UnicodeString *keywords, int32_t& arraySize) const;
19185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UBool isKeyword(const UnicodeString& keyword) const;
19285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    void setRepeatLimit();
19385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoprivate:
19485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t repeatLimit;
19585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho};
19685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
19785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoclass PluralKeywordEnumeration : public StringEnumeration {
19885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hopublic:
19985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    PluralKeywordEnumeration(RuleChain *header, UErrorCode& status);
20085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    virtual ~PluralKeywordEnumeration();
20185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    static UClassID U_EXPORT2 getStaticClassID(void);
20285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    virtual UClassID getDynamicClassID(void) const;
20385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    virtual const UnicodeString* snext(UErrorCode& status);
20485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    virtual void reset(UErrorCode& status);
20585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    virtual int32_t count(UErrorCode& status) const;
20685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoprivate:
20785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t pos;
20885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UVector fKeywordNames;
20985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho};
21085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
21185bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoU_NAMESPACE_END
21285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
21385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif /* #if !UCONFIG_NO_FORMATTING */
21485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
21585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif // _PLURRULE_IMPL
21685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho//eof
217