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