1 /* 2 ******************************************************************************* 3 * Copyright (C) 2007-2008, International Business Machines Corporation and 4 * others. All Rights Reserved. 5 ******************************************************************************* 6 * 7 * File PLURRULE_IMPL.H 8 * 9 ******************************************************************************* 10 */ 11 12 13 #ifndef PLURRULE_IMPLE 14 #define PLURRULE_IMPLE 15 16 /** 17 * \file 18 * \brief C++ API: Defines rules for mapping positive long values onto a small set of keywords. 19 */ 20 21 #if !UCONFIG_NO_FORMATTING 22 23 #include "unicode/format.h" 24 #include "unicode/locid.h" 25 #include "unicode/parseerr.h" 26 #include "unicode/utypes.h" 27 #include "uvector.h" 28 #include "hash.h" 29 30 U_NAMESPACE_BEGIN 31 32 #define DOT ((UChar)0x002E) 33 #define SINGLE_QUOTE ((UChar)0x0027) 34 #define SLASH ((UChar)0x002F) 35 #define BACKSLASH ((UChar)0x005C) 36 #define SPACE ((UChar)0x0020) 37 #define QUOTATION_MARK ((UChar)0x0022) 38 #define NUMBER_SIGN ((UChar)0x0023) 39 #define ASTERISK ((UChar)0x002A) 40 #define COMMA ((UChar)0x002C) 41 #define HYPHEN ((UChar)0x002D) 42 #define U_ZERO ((UChar)0x0030) 43 #define U_ONE ((UChar)0x0031) 44 #define U_TWO ((UChar)0x0032) 45 #define U_THREE ((UChar)0x0033) 46 #define U_FOUR ((UChar)0x0034) 47 #define U_FIVE ((UChar)0x0035) 48 #define U_SIX ((UChar)0x0036) 49 #define U_SEVEN ((UChar)0x0037) 50 #define U_EIGHT ((UChar)0x0038) 51 #define U_NINE ((UChar)0x0039) 52 #define COLON ((UChar)0x003A) 53 #define SEMI_COLON ((UChar)0x003B) 54 #define CAP_A ((UChar)0x0041) 55 #define CAP_B ((UChar)0x0042) 56 #define CAP_R ((UChar)0x0052) 57 #define CAP_Z ((UChar)0x005A) 58 #define LOWLINE ((UChar)0x005F) 59 #define LEFTBRACE ((UChar)0x007B) 60 #define RIGHTBRACE ((UChar)0x007D) 61 62 #define LOW_A ((UChar)0x0061) 63 #define LOW_B ((UChar)0x0062) 64 #define LOW_C ((UChar)0x0063) 65 #define LOW_D ((UChar)0x0064) 66 #define LOW_E ((UChar)0x0065) 67 #define LOW_F ((UChar)0x0066) 68 #define LOW_G ((UChar)0x0067) 69 #define LOW_H ((UChar)0x0068) 70 #define LOW_I ((UChar)0x0069) 71 #define LOW_J ((UChar)0x006a) 72 #define LOW_K ((UChar)0x006B) 73 #define LOW_L ((UChar)0x006C) 74 #define LOW_M ((UChar)0x006D) 75 #define LOW_N ((UChar)0x006E) 76 #define LOW_O ((UChar)0x006F) 77 #define LOW_P ((UChar)0x0070) 78 #define LOW_Q ((UChar)0x0071) 79 #define LOW_R ((UChar)0x0072) 80 #define LOW_S ((UChar)0x0073) 81 #define LOW_T ((UChar)0x0074) 82 #define LOW_U ((UChar)0x0075) 83 #define LOW_V ((UChar)0x0076) 84 #define LOW_W ((UChar)0x0077) 85 #define LOW_Y ((UChar)0x0079) 86 #define LOW_Z ((UChar)0x007A) 87 88 89 #define PLURAL_RANGE_HIGH 0x7fffffff; 90 91 92 class UnicodeSet; 93 94 typedef enum PluralKey { 95 pZero, 96 pOne, 97 pTwo, 98 pFew, 99 pMany, 100 pOther, 101 pLast 102 }PluralKey; 103 104 typedef enum tokenType { 105 none, 106 tLetter, 107 tNumber, 108 tComma, 109 tSemiColon, 110 tSpace, 111 tColon, 112 tDot, 113 tKeyword, 114 tZero, 115 tOne, 116 tTwo, 117 tFew, 118 tMany, 119 tOther, 120 tAnd, 121 tOr, 122 tMod, 123 tNot, 124 tIn, 125 tWithin, 126 tNotIn, 127 tVariableN, 128 tIs, 129 tLeftBrace, 130 tRightBrace 131 }tokenType; 132 133 class RuleParser : public UMemory { 134 public: 135 RuleParser(); 136 virtual ~RuleParser(); 137 void getNextToken(const UnicodeString& ruleData, int32_t *ruleIndex, UnicodeString& token, 138 tokenType& type, UErrorCode &status); 139 void checkSyntax(tokenType prevType, tokenType curType, UErrorCode &status); 140 private: 141 UnicodeSet *idStartFilter; 142 UnicodeSet *idContinueFilter; 143 144 void getKeyType(const UnicodeString& token, tokenType& type, UErrorCode &status); 145 UBool inRange(UChar ch, tokenType& type); 146 UBool isValidKeyword(const UnicodeString& token); 147 }; 148 149 class AndConstraint : public UMemory { 150 public: 151 typedef enum RuleOp { 152 NONE, 153 MOD 154 } RuleOp; 155 RuleOp op; 156 int32_t opNum; 157 int32_t rangeLow; 158 int32_t rangeHigh; 159 UBool notIn; 160 UBool integerOnly; 161 AndConstraint *next; 162 163 AndConstraint(); 164 AndConstraint(const AndConstraint& other); 165 virtual ~AndConstraint(); 166 AndConstraint* add(); 167 UBool isFulfilled(double number); 168 int32_t updateRepeatLimit(int32_t maxLimit); 169 }; 170 171 class OrConstraint : public UMemory { 172 public: 173 AndConstraint *childNode; 174 OrConstraint *next; 175 OrConstraint(); 176 177 OrConstraint(const OrConstraint& other); 178 virtual ~OrConstraint(); 179 AndConstraint* add(); 180 UBool isFulfilled(double number); 181 }; 182 183 class RuleChain : public UMemory { 184 public: 185 OrConstraint *ruleHeader; 186 UnicodeString keyword; 187 RuleChain(); 188 RuleChain(const RuleChain& other); 189 RuleChain *next; 190 191 virtual ~RuleChain(); 192 UnicodeString select(double number) const; 193 void dumpRules(UnicodeString& result); 194 int32_t getRepeatLimit(); 195 UErrorCode getKeywords(int32_t maxArraySize, UnicodeString *keywords, int32_t& arraySize) const; 196 UBool isKeyword(const UnicodeString& keyword) const; 197 void setRepeatLimit(); 198 private: 199 int32_t repeatLimit; 200 }; 201 202 class PluralKeywordEnumeration : public StringEnumeration { 203 public: 204 PluralKeywordEnumeration(RuleChain *header, UErrorCode& status); 205 virtual ~PluralKeywordEnumeration(); 206 static UClassID U_EXPORT2 getStaticClassID(void); 207 virtual UClassID getDynamicClassID(void) const; 208 virtual const UnicodeString* snext(UErrorCode& status); 209 virtual void reset(UErrorCode& status); 210 virtual int32_t count(UErrorCode& status) const; 211 private: 212 int32_t pos; 213 UVector fKeywordNames; 214 }; 215 216 U_NAMESPACE_END 217 218 #endif /* #if !UCONFIG_NO_FORMATTING */ 219 220 #endif // _PLURRULE_IMPL 221 //eof 222